面向对象的精神:可维护、可扩展、可复用、灵活性好。
三个基本特征【封装、继承、多态】
封装:每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装。
因为对象不必依赖其他对象来完成自己的操作,这样方法和属性包装在类中,通过类的实例来实现。
封装的好处:1、良好的封装可以减少耦合;2、类内部的实现可以自由的修改;3、类具有清晰的对外接口。
继承:对象的继承代表了一种“is-a”的关系,B继承A,表示B is A(猫是哺乳动物)。继承者是被继承者的特殊化,除了具备被继承者的特性之外,还具备自己独立的特性。继承定义了类如何相互关联,共享特性。
继承的工作方式是,定义父类(基类)和子类(派生类),其中子类继承父类的所有特性(父类所有非private属性和功能),子类还可以定义新的特性(扩展父类没有的属性和功能 or 重写父类方法)。 protect就是子类可以对基类有访问权的修饰符。
子类从父类继承的成员有方法、属性、事件、索引指示器,但是不能继承父类的构造器。构造器不能被继承,只能被调用。调用父类的成员,用base关键字。
优点:使用继承使得所有子类公共的部分都放在父类,使得代码得到共享,避免了重复。继承使得修改或扩展继承而来的实现都比较容易。
缺点:父类改变,子类不得不变。 继承破坏了包装,父类实现细节暴露给了子类,增大两个类的耦合性。【继承是一种父子类间的强耦合关系】
多态:多态表示不同的对象可以执行相同的动作,但是要通过它们自己的实现代码来执行。
多态原理:当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用,也就是说,虚方法是按照其运行时的类型(而非编译时类型)进行动态绑定调用的。
多态特点:
1、子类以父类的身份出现。
2、子类在工作时以自己的方式来实现。
3、子类以父类身份出现时,子类特有的属性和方法不可以使用。
4、为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚的。这是通过在该成员的返回值类型之前加上vittual关键字实现的。
5、子类可以选择使用override(重写)将父类实现替换为自己的实现。
五个设计原则:
【单一职责、开放封闭、依赖倒转、里氏代换、合成聚合复用、迪米特法则】
单一职责原理(Single-ResposibilityPrinciple):对于一个类而言,应该仅有一个引起它变化的原因。
开放-封闭原则(Open-Closedprinciple):软件实体(类、模块、函数等等)应该可以扩展,但是不可修改。
开放-封闭原则:对于扩展是开放的,对于更改是封闭的。设计人员必须预测最可能发生变化的种类,然后构造抽象来隔离变化。【但是拒绝不成熟的抽象】
开放-封闭原则精神:面对需求,对程序的改动是通过增加新代码进行的,而不是更改现有的代码。
开放-封闭原则是面向对象设计的核心所在,遵守这个原则可以带来的好处是:可维护、可扩展、可复用、灵活性好。
依赖倒转原则(Dependecy-Inversion Principle):高层模块不应该依赖底层模块,两个都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。
里式代换原则LSP(Liskov-SubstituionPrinciple):子类型必须能够替换掉它们的父类型。
只有当子类可以替换父类,父类才能真正被复用,而子类才能在父类的基础上增加新的行为。
迪米特法则LoD(Law ofDemeter):也叫最少知识原则。如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用,如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。
迪米特法则的根本思想是强调了类之间的松耦合。类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成波及。促进了软件的复用。
合成/聚合复用原则CARP (Composite Reuse Principle):尽量使用合成/聚合,不要使用类继承:
合成(composition)和聚合(aggregation)都是关联的特殊种类。聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分;合成则是一种强“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。【人群是一种聚合关系,但是人的身体和四肢是一种合成关系】
合成/聚合复用原则的好处是,优先使用对象的合成/聚合将有助于你保持每个类被封装,并被集中在单个任务上。这样类和类继承层次会保持较小的规模,并且不太可能增长为不可控制的庞然大物
(网上还有一个接口隔离原则,书上没写,这里也记录下来)
接口隔离原则ISP (InterfaceSegregation Principle):使用多个专门的接口,而不使用单一的总接口。
敏捷开发原则:不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般不着急去实现塔,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要撤销/恢复操作的时候,把原来代码重构为命令模式才有意义。