C#面向对象编程之多态

一、多态性

在面向对象编程中,当成需要实现多个相近的功能时,就给相应的方法起一个相同的名字。

二、方法重载

同一个类中添加几个名字相同,参数与返回值不同的方法。

类中有多个具有相同名称的方法,方法具有不同的参数列表。

方法签名:C#语言中如果两个方法无论是参数的数量、参数的类型、参数的顺序都一样的时候,则称为两个方法的前面相同。

方法重载也叫“静态多态性”

三、方法重写

1.方法重载指同一个类中方法的比较和研究。而方法重写指继承关系中不同类之间方法之间的比较和研究。方法重写virtual与overrride关键字。

2.定义虚方法:virtual关键字

3.基类不为virtual的方法,派生类不能使用override进行重写

4.加入派生类不用override关键字来声明方法,就不会重写基类方法,它只会称为和基类的方法完全不相关的另一个方法的实现,即方法覆盖。

5.使用new关键字显示声明发生方法覆盖,否则会出现警告信息。

6.new关键字显示的隐藏父类同名方法。作用是显示的隐藏同名的父类方法。

7.不能重写父类中的sealed方法

8.不能重写父类中的staticf方法

9.子类必须重写父类中的抽象方法

10.类的ToString()方法都是继承于Object类的虚方法,打印出来事类的全路径名称。我们可以重写自己的ToString()方法

11.Sealed 密封类

1)密封类表示不能继承该类

2)密封方法表示不能重写该方法

3)可以覆盖父类的密封方法,与父类中的方法是否为密封方法没有关系。但不能重写

4)密封类一般用于不希望第三方拓展类的情况下。.NET基类库就大量使用了密封类。比如string就是一个密封类

四、抽象类、抽象方法

语法:abstract class Person{ public abstract void Say();//抽象方法 } //抽象类

有抽象方法的类必然是抽象类。

1.抽象类用来列举一个类所需要的行为

2.抽象类不能被实例化

3.抽象类不明确提供具体实现方法

4.抽象类必须由子类实现它的抽象方法。(除非子类也具有抽象性)

5.抽象类和抽象方法实现多态性

6.父类提供一系列的规定,约束子类的行为

7.父类可以提供一些共性的行为

8.定义基类中的抽象方法,则派生类必须重写该方法 [小技巧:可以使用vs右键菜单“实现抽象类“自动完成]

9.抽象方法一定属于抽象类,但抽象类不一定要包含抽象方法

10.抽象方法不能说私有的,而且抽象方法及其重载方法的访问限制应当相同

11.抽象方法不能使用virtual关键字进行修饰

12.

虚方法 抽象方法
用virtual修饰 用abstrac修饰
要有方法体 不允许有方法体
可以被子类override 必须被子类override
除了密封类都可以写 只能在抽象类中

五、接口、多重接口

1.接口是不同物理设备与软件程序实现沟通与数据传输的规格与标准

2.接口就是某个事物对外提供的一些功能的申明

3.可以利用接口实现多态,同时接口也弥补了C#单一继承的弱点

4.使用interface关键字定义接口

5.一般使用接口声明方法或常量,接口中的方法只能是声明,不能是具体的实现

6.接口可以继承,类似与类的继承

7.接口和抽象类不能被实例化

8.接口的任何派生实现类,都必须实现接口的所有方法。

9.接口不允许有任何构造函数或字段

10.接口成员总是公共的,不能声明虚拟和静态的。

11.interface<接口名>{//声明主体}

12.接口中不允许制定任何访问修饰符。(隐式为public)

13.接口中不允许定义字段

14.好的编程习惯:使用接口名作为方法的前缀,这称为”显示接口实现”

15.接口成员总是公共的,不能声明虚拟和静态的。

16.接口为“公共契约”

六、多态性总结

1.不能同时使用virtual和override修饰一个方法

2.虚拟方法不能是私有的

3.对于interface、virtual、override、sealed关键字的理解:

interface 引入一个方法的名称

virtual 方法的第一个实现

override 方法的另一个实现

sealed 方法的最后一个实现

猜你喜欢

转载自blog.csdn.net/weixin_49251429/article/details/123140734