C# 多态理论基础

时间:2021-11-13 07:08:04

标签:

一、概述

 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。

 可以用不同的方式实现组件中的多态性: 

● 接口多态性。 
● 继承多态性。 
● 通过抽象类实现的多态性。

二、实现 2.1、虚方法

定义:当类中的方法声明前加上 virtual 修饰符,则称之为虚方法。

作用:子类可以对父类中的虚方法进行重写,虚方法是多态特性的一种体现。

即,用virtual关键字修饰父类方法,用 override 关键字修饰子类方法,实现了方法重写。

特点:

a)、使用了virtual修饰符后不允许再有staticabstractoverride修饰符

b)、父类方法的访问级别和子类重写方法的的访问级别必须相同,即它们应该具有相同的访问修饰符

2.2、抽象类和抽象方法

描述:如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法。

抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。

抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

2.2.1、抽象类的特点:

a)、抽象类不能实例化(不能使用new 操作

b)、抽象类可以包含抽象方法和抽象访问器

c)、抽象类不能是密封的或静态的(不能在抽象类前加 static 或 sealed

d)、从抽象类派生的非抽象类必须实现继承的所有抽象方法和抽象访问器

e)、抽象类是子类的描述,只有被子类继承,才有实际意义

2.2.2、抽象类对构造函数的限制:

a)、不要在抽象类中定义公共的或受保护的内部构造函数(具有publicprotected internal可见性的构造函数用于能进行实例化的类型,而任何情况下抽象类型不能实例化)

b)、应在抽象类中定义一个受保护的(protected)或私有的(private)构造函数

c)、如果在抽象类中定义一个受保护的(protected)构造函数,则在创建派生类的实例时,基类可执行初始化。

2.2.3、抽象方法的特点:

定义:在抽象类中,一个方法声明如果加上 abstract 修饰符,则称该方法为抽象方法

a)、抽象方法是隐式的虚方法。(抽象方法可以看作是没有方法体的虚方法)

b)、只允许在抽象类中使用抽象方法声明

c)、因为抽象方法声明不提供实际的实现,所有没有方法体。(即:方法声明只是以一个分号结束,并且在签名后没有大括号{},实现由重写方法提供,此重写方法是非抽象类的成员)

d)、在抽象方法声明中不能使用 static virtual 修饰符

e)、除了在声明和调用语法上不同外,抽象属性的行为与抽象方法一样

f)、不能在静态属性上使用 abstract 修饰符

g)、在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性

[注]:

Animal a = new Dog;

a.Cry();

a.Show;

Animal:抽象类,其中有一个抽象方法Cry(),一个具体方法Show()

Dog:继承父类Animal,并使用 override 重写抽象方法Cry(),并且有一个子类自己的具体方法ShowDog()

由此可得结论:

1、并没有实例化抽象类,只是声明了一个抽象类对象,实例化必须通过构造函数来实现,而这里调用的是子类的构造函数,所以实例化的是子类对象,只是抽象对象引用了子类实例

2、抽象类对象调用了子类的Cry()方法和本身的Show方法,子类的ShowDog()方法是不能被访问的

3、抽象类对象引用子类实例后,基本上还是属于抽象类,能够访问子类重写的方法和父类自己的属性和方法,子类自己的属性和方法是不能访问的。

2.3、接口

描述:

a)、在.NET中,接口是一种规范和标准,是纯粹的协议。

b)、接口没有提供默认的实现,由接口定义的某个特定成员依赖于它所模拟的确切行为。接口表示某个类或结构可以选择去实现的行为。

c)、从语法来说,接口使用 interface 关键字定义。和类不一样的是,接口不指定基类,,但接口可以指定基接口。

d)、接口的成员不指定访问修饰符(因为所有接口成员都是隐式公共的和抽象的)

e)、除非被类或接口实现,否则接口没有作用。

f)、直接基类必须是冒号操作符后的第一个项。

g)、实现接口是一个“要么全要,要么全不要”的命题。

h)、当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

i)、在C#中,一个类虽然不能实现多重继承,但是一个类可以实现多个接口。

j)、接口是引用类型的,类似于类。

k)、 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;

l)、 一个类一次可以实现若干个接口,但是只能扩展一个父类。