using System; using System.Collections.Generic; using System.Text; namespace 类的继承问题04{ class Program { static void Main( string [] args) { A Aa; // 定义一个引用变量 虽然抽象类不可以实例化,但可以声明抽象类的引用变量 C Ca = new C(); Aa = Ca; Aa.AbstractMethod01(); // 调用C类实现的AbstractMethod01()方法,这个是通过多态实现的 Aa.NotAbstractMethod(); // 调用自身的非抽象方法 B Ba; // 定义一个引用变量 虽然抽象类不可以实例化,但可以声明抽象类的引用变量 Ba = (B)Aa; Ba.AbstractMethod01(); // 调用C类实现的AbstractMethod01()方法,原因是多态 Ba.AbstractMethod02(); // 调用C类实现的AbstractMethod02()方法,原因是多态 Console.ReadKey(); } } abstract class A { public abstract void AbstractMethod01(); // 抽象方法,没有主体,结尾以分号结束 public abstract void AbstractMethod02(); // 抽象方法,没有主体,结尾以分号结束 public void NotAbstractMethod() { Console.WriteLine( " 抽象类A中的非抽象方法 " ); } } abstract class B : A // 派生自抽象类A的B可以不实现其抽象方法,但要保证B类也必须是抽象的才行 { public override void AbstractMethod01() // ,派生类B中实现了基类A中的一个抽象方法,另一个不实现是可以的 { // 也就是说,派生类可以不完全实现抽象基类的抽象方法,此时这个派生类必须也是抽象的 Console.WriteLine( " B类实现的抽象方法01 " ); } } class C : B // 最中实现了A类中的抽象方法,终于冲破了“抽象诅咒” { public override void AbstractMethod01() { // throw new Exception("The method or operation is not implemented."); base .AbstractMethod01(); // 通过base可以调用抽象基类中的抽象方法,此时是调用基类B中的AbstractMethod01()方法 Console.WriteLine( " C类实现的抽象方法01 " ); } public override void AbstractMethod02() { // throw new Exception("The method or operation is not implemented.");] Console.WriteLine( " C类实现的抽象方法02 " ); } } abstract class F : A // 虽然F类派生自抽象类A,但它可以一个也不实现A中的抽象方法 { // 但要保证F是抽象类 } class E : F { public override void AbstractMethod01() { Console.WriteLine( " E类实现的抽象方法01 " ); } public override void AbstractMethod02() { Console.WriteLine( " E类实现的抽象方法02 " ); } }}