C#多态性的内涵实际就是通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。C# 中的每种类型都是多态的。类型可用作它们自己的类型或用作 Object 实例,因为任何类型都自动将 Object 当作基类型。
多态性不仅对派生类很重要,对基类也很重要。任何情况下,使用基类实际上都可能是在使用已强制转换为基类类型的派生类对象。基类的设计者可以预测到其基类中可能会在派生类中发生更改的方面。例如,表示汽车的基类可能包含这样的行为:当考虑的汽车为小型货车或敞篷汽车时,这些行为将会改变。基类可以将这些类成员标记为虚拟的,从而允许表示敞篷汽车和小型货车的派生类重写该行为。
C#多态性概念的理解
当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。若要更改基类的数据和行为,您有两种选择:可以使用新的派生成员替换基成员,或者可以重写虚拟的基成员。
使用新的派生成员替换基类的成员需要使用 new 关键字。如果基类定义了一个方法、字段或属性,则 new 关键字用于在派生类中创建该方法、字段或属性的新定义。new 关键字放置在要替换的类成员的返回类型之前。例如:
C#多态性概念实例
- public class BaseClass
- {
- public void DoWork() { }
- public int WorkField;
- public int WorkProperty
- {
- get { return 0; }
- }
- }
- public class DerivedClass : BaseClass
- {
- public new void DoWork() { }
- public new int WorkField;
- public new int WorkProperty
- {
- get { return 0; }
- }
- }
C#多态性实例中使用new关键字时,调用的是新的类成员而不是已被替换的基类成员。这些基类成员称为隐藏成员。如果将派生类的实例强制转换为基类的实例,就仍然可以调用隐藏类成员。例如:
- DerivedClass B = new DerivedClass();
- B.DoWork();// Calls the new method.
- BaseClass A = (BaseClass)B;
- A.DoWork();// Calls the old method.
为了使派生类的实例完全接替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加 virtual 关键字来实现的。然后,派生类可以选择使用 override 关键字而不是 new,将基类实现替换为它自己的实现。例如:
- public class BaseClass
- {
- public virtual void DoWork() { }
- public virtual int WorkProperty
- {
- get { return 0; }
- }
- }
- public class DerivedClass : BaseClass
- {
- public override void DoWork() { }
- public override int WorkProperty
- {
- get { return 0; }
- }
- }
C#多态性概念中字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的。当派生类重写某个虚拟成员时,即使该派生类的实例被当作基类的实例访问,也会调用该成员。例如:
- DerivedClass B = new DerivedClass();
- B.DoWork();// Calls the new method.
- BaseClass A = (BaseClass)B;
- A.DoWork();// Also calls the new method
C#多态性的相关理解就向你介绍到这里,希望对你了解和学习C#多态性有所帮助。
【编辑推荐】