您的位置:首页 > 其它

面向对象设计

2016-04-12 19:55 232 查看

面向对象设计

三要素

封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操做,对不可信的进行信息隐藏。

继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承可以通过继承和组合实现。实现继承:使用基类的属性和方法而无需额外编码的能力;接口继承:仅使用属性和方法的名称,但是子类必须提供实现的能力;可视继承:指子窗口(类)使用基窗体(类)的外观和实现代码的能力。

多态:指允许将父对象设置为一个或更多的它的子对象相等技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。即允许子类类型的指针赋值给父类类型的指针。实现多态方式:覆盖和重载。覆盖指子类重新定义父类的虚函数;重载指允许存在多个同名函数,而这些函数的参数表不同(参数个数,参数类型等不同)。重载是编译器根据不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数,它是静态的,即地址在编译期就绑定(早绑定)。重载与多态无关。真正的多态值覆盖。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间无法确定(调用的子类的虚函数地址无法给出)。这样的函数运行期绑定(晚绑定)。重载只是一种语言特性,与多态无关,与面向对象也无关。只要不是晚期绑定,就不是多态。

封装可以隐藏实现细节,使得代码模块化,继承可以扩展依存在的代码模块(类),它们的目的是代码重用。而多态则是为了实现另一个目的,接口重用。多态的作用是为了类在继承和派生的时候,保证使用任一类的实例的某一属性时的正确调用。

五原则

单一功能原则(SRP):对象仅具有一种单一功能。主要指一个类发生变化的原因不应该超过一个,也即代码中每个类,或者类似结果的只有一个功能,体现的是内聚性。实现方法可以通过对类只定义一个方法或属性。试想,如果一个类中混合了多个职责,则很难实现修改一部分时,不破坏其他部分。

开闭原则(OCR):软件体应该是对于扩展开放的,但是对于修改封闭。对扩展开发指设计类时要考虑到新需求提出时类可以增加新的功能。对修改关闭指一旦一个类开发完成,处理修改bug,就不再修改它。通常可以通过依赖关系的抽象实现开闭原子,如接口和抽象类而不是具体类,通过创建新的类实现接口来增加功能。OCR仅仅用于即将到来的变化可预见的情况,只有类似的变化已经发生时用它。故做最简单的事情,然后判断会有什么变化,就能更加准确地预见将来的变化。即等待用户做出改变,然后使用抽象应对将来的类似变化。

里氏替换原则(LSP):程序中的对象应该是可以在不改变程序正确性的前提下被它的子类所替换。此原则适用于继承层次结构。它要求所有子类必须按照和他们父类相同的方式操作。子类的特定功能可能不同,但是必须符合父类的预期行为。要成为真正的行为子类型,子类必须不仅要实现父类的方法和属性,也要符合其隐含行为。违反LSP可能导致不明确的行为。不明确行为指开发过程中运行良好但在产品中出现问题,或者要花费几个星期调试每天只出现一次的bug,或者不得不查阅数百兆日志找出什么地方发生错误。

接口隔离原则(ISP):多个特定客户端接口要好于一个宽泛用途的接口。但使用非内聚的接口时,ISP指导我们创建较小的内聚度高的接口。使用ISP时,类和他们的依赖使用紧密集中的接口通信,最大限度地减少对未使用的依赖,并相应地降低耦合度。小接口容易实现,提升了灵活性和重用的可能性。由于很少的类共享这些接口,为响应接口的变化而需要变换的类数量降低,增加鲁棒性。教训为“不要依赖你不需要的东西”。

依赖反转原则(D):一个方法应该遵从依赖于抽象而不是一个实例,它是一种实现方式。它指出高层次模块不应该依赖于低层次模块。它们应该依赖于抽象;抽象不应该依赖于细节;细节依赖于抽象。方法将类孤立在依赖于抽象形成的边界后面,如果抽象后面所有的细节发生变化,类仍然安全。有助于保持低耦合,是设计更容易改变。DIP允许做单独测试,如作为系统插件的数据库等细节。

参考文献

http://blog.csdn.net/green_shing/article/details/21243331

http://www.importnew.com/10656.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面向对象