《C#从现象到本质》读书笔记(四)第4章C#和面向对象

《C#从现象到本质》读书笔记第4章C#和面向对象

面向对象程序设计OOP

面向对象的三大特性是:

1)封装:类可以将它的成员私有化,只暴露它认为应当暴露给外界的成员。通过私有化成员,外界不必了解这些成员的实现细节。

2)继承:子类可以继承父类,从而简单地自动实现父类所有的成员,并增加自己的成员。通过方法的重写和隐藏,子类还可以修改父类的行为。

3)多态:实际上是继承的一种特殊情况,此时,子类一定会复写父类的行为(通常父类没有提供代码)。接口和抽象类都是多态的体现。

通过继承和多态,增强代码的复用功能。通过封装避免不合理的访问。

在创建子类对象时,子类的方法表包括了父类的虚方法和指向父类方法表的指针,使得子类可以调用父类的方法。另外,如果存在方法的重写,则会用子类的方法替代掉父类的方法。

子类型可以使用override显式地重写该方法,或者使用new隐藏该方法。

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         A a=new A();
 6         a.NormalMethod();//A.NormalMethod
 7         a.NewMethod();//A.NewMethod
 8 
 9         B b=new B();
10         b.NormalMethod();//B.NormalMethod"
11         b.NewMethod();//B.NewMethod
12 
13         A a2=new B();
14         a2.NormalMethod();//B.NormalMethod"
15         a2.NewMethod();//A.NewMethod
16         Console.ReadKey();
17         }
18 }
19 
20 internal class A
21 {
22     public virtual void NormalMethod()
23     {
24         Console.WriteLine("A.NormalMethod");
25     }
26     public virtual void NewMethod()
27     {
28         Console.WriteLine("A.NewMethod");
29     }
30 }
31 
32 class B:A
33 {
34     public override void NormalMethod()
35     {
36         Console.WriteLine("B.NormalMethod");
37     }
38     public new void NewMethod()
39     {
40         Console.WriteLine("B.NewMethod");
41     }
42 }

抽象类(abstract修饰类或者方法)不能建立实例;不能密封抽象类因为这违反了它只有被继承才有意义的原则;抽象类只有被派生类继承才有意义;抽象方法必须放置在抽象类中。抽象类可以拥有非抽象方法,而接口作为一个特殊的抽象类,不能含有非抽象的方法。

抽象类和接口有一些区别,接口是一种特殊的抽象类:

1)接口不能有非抽象方法,而抽象类可以有非抽象方法。

2)接口和抽象类都不能被实例化。

3)如果继承接口,必须实现接口所有的抽象方法。而继承抽象类的类可以只实现一部分父类的抽象方法。

4)一个类可以继承多个接口,但只能继承自一个别的类。

5)不能密封抽象类和接口。因为这破坏了接口和抽象类本身的性质,即被人继承。

抽象类和它的子类之间应该是一般和特殊的关系,而接口仅仅是它的子类应该实现的一组规则。

面向对象编程五大规则SOLID

1)单一职责原则:有且仅有一个原因引起类的变更。低耦合,高内聚。SPR。

2)开闭原则:软件实体应当对修改关闭,对扩展开放。对抽象编程,因为抽象相对稳定。OCP。工厂方法模式。

3)里式替换原则:所有引用积累的地方必须能够透明地使用其子类的对象。子类必须能够替换其基类。LSP。

4)接口隔离原则:尽量应用专门的接口,而不是单一的总接口,接口应该面向用户,将依赖建立在最小的接口上。客户端不应该依赖它不需要的原则。ISP。

5)依赖倒置原则:依赖于抽象,而不要依赖于具体,因为抽象相对稳定。高层模块不应该依赖底层模块,两者都应该依赖其抽象,抽象不应该依赖于细节,细节应该依赖抽象。DIP。

原文地址:https://www.cnblogs.com/Lvkang/p/9692779.html