学习笔记-面向对象

面向对象和面向过程区别

面向过程就是分析出解决问题需要的步骤,然后用函数把这些步骤一个个实现,使用的时候依次调用,面向过程的核心是过程。

面向对象就是把构成问题的事物分解成一个个对象,建立对象不是为了实现一个步骤,而是为了描述某个事物在解决问题中的行为,面向对象的核心是对象。

面向过程就是你把代码封装成函数(procedure),然后依次去做一件事情;
面向对象就是你把要做的事情抽象成对象,告诉对象去做。

类是描述具有相同特征与行为的事物的抽象

对象是类的具体

类是面向对象编程的基本单元;类造出来的变量叫对象。

面向对象三大基本特性,五大基本原则

三大特性是:封装,继承,多态   

五大基本原则 

单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,只负责处理同一类的操作。强调的是职责的分离。

其核心的思想是:一个类,最好只做一件事,只有一个引起它变化的原因。低耦合、高内聚的体现

实例http://www.cnblogs.com/adam/archive/2008/04/18/1159251.html

 

开放封闭原则OCP(OpenClose Principle) 
扩展性方面应该是开放的而在更改性方面应该是封闭的。封装变化、降低耦合,抽象和多态的应用

对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。

对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

实例http://www.cnblogs.com/adam/archive/2008/04/18/1159280.html

 封装变化,是实现开放封闭原则的重要手段,对于经常发生变化的状态一般将其封装为一个抽象

里氏替换原则(the Liskov Substitution Principle LSP) 

子类应当可以替换父类并出现在父类能够出现的任何地方。继承的体现

实例http://www.cnblogs.com/sunwei2012/archive/2010/03/10/1682415.html

 

依赖原则(the Dependency Inversion Principle DIP)

具体依赖抽象,上层依赖下层。

假设B是较A低的模块,但B需要使用到A的功能,这个时候,B不应当直接使用A中的具体类,而应当由B定义一抽象接口,并由A来实现这个抽象接口,B只使用这个抽象接口,这样就达到

了依赖倒置的目的,B也解除了对A的依赖,反过来是A依赖于B定义的抽象接口。

实例http://www.cnblogs.com/liuhaorain/p/3747470.html#title_2

 

接口分离原则(the Interface Segregation Principle ISP) 
模块间要通过抽象接口隔离开,不通过具体的类关联,降低耦合度

如果类的接口定义暴露了过多的行为,则说明这个类的接口定义内聚程度不够好。换句话说,类的接口可以被分解为多组功能函数的组合,每一组都服务于不同的客户类,而不同的客户类可以选择使用不同的功能分组。

 实例http://www.cnblogs.com/gaochundong/p/interface_segregation_principle.html

总结:

单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一, 
开放封闭原则OCP(OpenClose Principle) 
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。 
替换原则(the Liskov Substitution Principle LSP) 
子类应当可以替换父类并出现在父类能够出现的任何地方。
依赖原则(the Dependency Inversion Principle DIP)

A.高层次的模块不应该依赖于低层次的模块,他们都应该依赖于抽象。

B.抽象不应该依赖于具体实现,具体实现应该依赖于抽象。

接口分离原则(the Interface Segregation Principle ISP) 
使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口。

 

封装概念

封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装可以隐藏实现细节,使得代码模块化。保护数据。

封装的优点

A.良好的封装能够减少耦合(比如实现界面和逻辑分离)

B.可以让类对外接口不变,内部可以实现自由的修改

C.类具有清晰的对外接口,使用者只需调用,无需关心内部

D.因为封装的类功能相对独立,因此能更好的实现代码复用

E.可保护代码不被无意中破坏,通过私有字段等实现内部。注意:这里的代码保护不是指代码本身的加密,而是对不想外部更改的代码通过私有实现。

要点:

1.封装,就是把一个对象所能操作的所有信息放在一起

2.封装能减少耦合,保持统一的对外接口,内部修改不影响外部调用

要点:

1.封装,就是把一个对象所能操作的所有信息放在一起

2.封装能减少耦合,保持统一的对外接口,内部修改不影响外部调用

总结封装作用或优点:

1减少耦合

2内部修改不影响外部调用

3 隐藏内部实现

4 代码复用

5 保护数据

封装优点:

封装,解决了将对同一对象所能操作的所有信息放在一起,实现统一对外调用,实现了同一对象的复用,降低了耦合。

封装的实现:

将一个或多个项目集合在一个单元中,这个单元称之为类

对象:

对于封装而言,一个对象它所封装的是自己的属性和方法

继承

  继承有这样一种能力,就是能使用现有的类的所有功能,并无须重新编写原来的这些类的基础上对这些功能进行扩展。(通过继承创建的新类称为子类或派生类,被继承的称为基类。继承有两种,一种是实现继承,另外一种是接口继承。实现继承可以直接使用基类的属性和方法而无需额外编码,接口继承是指使用属性和方法的名称,但是子必须提供实现的能力。 )

继承的概念

 (1) 当一个类A能够获取另一个类B中所有非私有的数据和操作的定义作为自己的部分或全部成分时,就称这两个类之间具有继承关系。

(2) 被继承的类B称为父类或基类,继承了父类的类A称为子类或派生类.

 继承的特点

特点一:派生类除了继承父类的特性外,还可以有自己独有特性

特点二:子类不能拥有父类的私有成员

特点三:子类可以以自己的方式实现父类的功能(即方法重写)

继承的缺点

 缺点一:父类变化,子类不得不变;

 缺点二:继承破坏了包装,父类的细节暴露给了子类。

继承的要点:
  1、继承是可传递的。如果CB中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object 类作为所有类的基类。
  2、派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。
  3、构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。
  4、派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再访问这些成员。
  5、类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。
  6、派生类只能从一个类中继承,可以通过接口实现多重继承。

      7 不允许循环依赖项

 

子类有同名方法,隐藏基类同名方法。

继承的三个关键字:

abstract 抽象。 ;用来限定方法时, 不能有方法实体,并且在子类中必须完成方法实体,除非子类继续使用抽象方法。

virtual 用来指示类中的方法可以被子类的同名方法覆盖或者共存,覆盖时,子类中使用override关键字;共存时,使用new 关键字。

new 在子类方法中的用法是指子类中与父类存在的同名方法在方法列表敏感词存,并不覆盖父类的方法,这就达到了多态机制下并非一味覆盖的效果。

 

抽象:

1、抽象类中的抽象属性和抽象方法必须是公有的,因此必须有public修饰符
2、子类必须override抽象类中的所有抽象属性和抽象方法,如果没有全部override,那么子类必须是抽象类
3、抽象类中可以有非抽象属性和非抽象方法,也可以是私有或者公有,但是如果是私有的话子类就不能访问,无意义,所以一般情况下都设置为公有
4、有抽象方法或抽象属性的类一定是抽象类,抽象类中的属性或方法不一定都是抽象的

new 在子类方法中的用法是指子类中与父类存在的同名方法在方法列表敏感词存,并不覆盖父类的方法,这就达到了多态机制下并非一味覆盖的效果。

“sealed”关键字修饰的类将不能被继承;

base调用基类方法,善用“base”关键字,显示调用合适的自定义基类构造函数而不是使用默认构造函数。

被“protected”修饰的成员或者数据可以直接被派生类访问,属于“可以在家族里分享的秘密”。

通过base 关键字访问基类的成员: 

调用基类上已被其他方法重写的方法。 

指定创建派生类实例时应调用的基类构造函数。 

基类访问只能在构造函数、实例方法或实例属性访问器中进行。
从静态方法中使用 base 关键字是错误的。

 

继承中关于属性的一些问题
  属性的覆盖
  1. 在派生类中使用修饰符的属性,表示对基类中的同名属性进行覆盖。
  2. 在覆盖的声明中,属性的名称、类型、访问修饰符都应该与基类中被继承的属性一致。
  3. 如果基类的属性只有一个属性访问器,覆盖后的属性也应只有一个。但如果基类的属性同时包含get set 属性访问器,重载后的属性可以只有一个,也可以同时有两个属性访问器。
  注意:与方法重载不同的是,属性的覆盖声明实际上并没有声明新的属性,而只是为已有的虚属性提供访问器的具体实现。
  虚属性
  1. 使用virtual 修饰符声明的属性为虚属性。
  2. 虚属性的访问器包括get 访问器和set 访问器,同样也是虚的。
  抽象属性
  1. 使用abstract 修饰符声明的属性为抽象属性。
  2. 抽象属性的访问器也是虚的,而且没有提供访问器的具体实现。这就要求在非虚的派生类中,由派生类自己通过重载属性来提供对访问器的具体实现。
  3. abstract override 修饰符的同时使用,不但表示属性是抽象的,。而且它重载了基类中的虚属性这时属性的访问器也是抽象的。
  4. 抽象属性只允许在抽象类中声明。
  5. 除了同时使用abstract override 修饰符这种情况之外,static, virtual, overrideabstract 修饰符中任意两个不能再同时出现。
  密封属性
  1. 使用sealed 修饰符声明的属性为密封属性。类的密封属性不允许在派生类中被继承。密封属性的访问器同样也是密封的。
  2. 属性声明时如果有sealed 修饰符,同时也必须要有override 修饰符。

 

自己实践总结

父类有一个方法a 不用virtual修辞

子类有同名方法a

子类和new作用类似,隐藏基类方法,new是显式隐藏

子类有同名方法a   override 修辞

报错  未标记为 virtual、abstract 或 override,无法进行重写

总结: 只有用虚方法可以重写,否则只能隐藏。

“覆盖”就是重新实现了父类的方法,而“隐藏”只是把父类中的方法藏了起来,通过父类的引用来调用这个方法的时候,这个被“隐藏”的方法就被激活了。

总结:继承就是使用基类功能,无需编写原有功能进行扩展

多态

1概念:父类引用指向不同子类实例的时候,父类引用所调用的函数都是子类的函数,由于子类对象不同,父类引用调用的成员表现出来的不同状态就是一种多态。

总结:同一父类的实例,调用同一方法,子类对象不同,调用状态不同

多态编程的基本原理是:

使用基类或接口变量编程。

多态的实现分为两大基本类别:继承多态和接口多态。

编程中应用多态特征:

应用继承实现对象的统一管理。

应用接口定义对象的行为特征。

 

使用多态的好处:

当要修改程序并扩充系统时,需要修改的地方较少,对其他部分代码的影响较小。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值