通过学习设计模式对面向对象编程有了更深层次的了解。在《大话设计模式》一书中的第一个设计模式里(简单工厂模式)体会到了自己学习面向对象编程时的历程。
首先要保证代码无错,我想这是大部分初学者的心愿。其次就是代码规范,这一点是很重要的,程序不仅仅是写给自己看的,更需要让别人能看懂。别人能看懂还不行,毕竟编程是已经成本很高的事,要想获得收益,首先想到的就是要降低成本。那么,降低哪些成本呢?当然这就要涉及到程序的维护、扩展和复用,这样才能有效降低成本。而面向对象的编程方法也就应运而生了。众所周知,面向对象有三个特性:封装、继承和多态。
封装
是对象和类概念的主要特征。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏,可以隐藏实现细节,使得代码模块化。
继承
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类”。被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。继承可以扩展已存在的代码模块(类);它和封装的目的都是为了——代码重用。
多态
多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态与封装和继承有所不同,它是为了实现接口重用。
实现多态,有两种方式:覆盖、重载。
覆盖:是指子类重新定义父类的虚函数的做法。
重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。
但是,重载并不是严格意义上的多态,只不过它可以实现多态的特性而已。
多态必须具备三大特征:子类继承父类,子类覆盖父类,父类指向子类。如果是这样的话,就说明只有继承关系才是多态的先决条件。
多态是基于对抽象方法的覆盖来实现的,用统一的对外接口来完成不同的功能。重载也是用统一的对外接口来完成不同的功能。那么两者有什么区别呢?
重载,是指允许存在多个同名方法,而这些方法的参数不同。重载的实现是:编译器根据方法不同的参数表,对同名方法的名称做修饰。对于编译器而言,这些同名方法就成了不同的方法。它们的调用地址在编译期就绑定了。
多态:是指子类重新定义父类的虚方法(virtual,abstract)。当子类重新定义了父类的虚方法后,父类根据赋给它的不同的子类,动态调用属于子类的该方法,这样的方法调用在编译期间是无法确定的。
不难看出,两者的区别在于编译器何时去寻找所要调用的具体方法,对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法,这称为“早绑定”或“静态绑定”;而对于多态,只有等到方法调用的那一刻,编译器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。
多态是指只有到运行时才能确定要执行的代码,即指的是后绑定。
设计模式就是面向对象编程的良好体现,在接下来的学习中,将重点总结设计模式。