题目就这么抽象~。~其实一点都不抽象,老师以前也说过吧,面向对象就是建立在面向过程的基础上的。 下面这些主要是能让大家吸收一些较新鲜的编程思路,对于嵌入式编程大有裨益,对理解面向对象的底层封装全新的认识,对引入go的必要性的一些阐述。 下面以java作为面向对象语言,以c作为面向过程语言和以go作为一种新型语言进行对比。 面向对象的概念中引入了一个重要的东西就是类,类中有两种主要的东西:成员方法和成员变量,在面向过程中我们主要依靠结构体struct来抽象“类”这种数据结构中的成员变量部分,依靠函数来抽象“类“中的方法。具体请看以下例子:在java中定义一个最简单的类 public static class Person{ //sataic是为了方便后面调用演示直接类调用 String name; int age; walk(){ System.out.println("walking"); } } 在c中可以这样去实现 首先定义结构体去描述数据部分,然后去写函数来实现walk功能,最后用封装后的组合来调这种我们自己DIY的这种数据结构: struct Person{ char[20] name;int age;} 下面定义方法 void Person_walk(){ println("walking");} 最后: 在java中 Person.name和Person.walk()来执行 在c中则必须这样来用 int main(){ Person p;?=p.name;?=p.age;Person_walk();} //类似这种代码去实现,很显然我写的很随意,完全可以用指 //针进行地址传递,我只是简单的的这样写 很明显你如果实际中真的这么写太麻烦了,首先c中没有一种现成的数据结构把成员变量和方法很好地结合在一起除非你频繁的运用指针,另外我们无法实现过深的继承层次,还有没有”包“的概念,只有全局和局部这两种权限范围很容易让你的代码出现未知错误。 其实在后台像c++真的是靠编译器借着隐藏的this指针翻译为c中的结构体这种类型去做的 那么我们可以看到c++(又名c with class和c plus plus)他这种叫法可以看出就是c的增强版。但是c在现在看来是一门古老的语言,c++的标准过于复杂,以至于他的创造者都很难去完全掌握它。有没有其他的办法呢,答案是肯定有滴,出自贝尔实验室血统的人马,加盟google后推出的go语言很好地解决了这个问题,这是一个定义为现代的,软件工程的,为最终取代c的系统级编程语言,我们来看一看他是怎么做的: type Person struct{ age floatname string} func (p *Person) Walk() { fmt.println("walking")} 下面是使用它的格式: p1:=new(Person)p1.Walk()fmt.println(p1.age)fmt.println(p1.name) 就这么简单,从语法上支持函数与结构体的绑定,简单调用,从而实现java中的”类“,当然除此之外的多态实现还要依靠go中的interface{}类型他就是java中的object类型的作用。下面做一点注释:go中没有每句结束的分号,因为这是不必要的。go中的:号是变量定义的简化关键字详情请百度一下。fmt是go中的标准库函数,我省略了引用,go不支持”类“,但支持面向对象这一思想。 就说这么多了,oop只是go的一方面体现,其他的功能给大家自己去发现,就是想让大家体会一下指针的强大作用,以及oo思想的另一种体现方法。晚安喽,假期愉快。 参考资料: 《深度探索c++对象模型》《go语言编程》《c语言程序设计》《thinking in java》本文所有代码都是简化版,不能直接运行,仅供相互对比。 go是明日之星。 by: flybutterfly ceo#gotobe.net#代表什么你懂的2014.1.14 ![]() |