using System;using System.Collections.Generic;using System.Text;
namespace ConsoleApplication1{ class Program { static void Main(string[] args) { A Aa = new A(); Aa.BaseMethod();
B Ba = new B(); Ba.BMethod();
D Da = new D(); Da.BaseMethod();
F Fa = new F(); Fa.AbstractMethod(); Fa.BaseMethod();//派生类F的实例调用抽象基类E中的非抽象方法 BaseMethod() E Ea = Fa; //隐式转换,或者上强制类型转换 Ea.AbstractMethod();//多态,E的变量可以调用派生类中重写的虚拟抽象方法AbstractMethod() Ea.BaseMethod(); //调用自身的BaseMethod()方法 Console.ReadKey(); } } sealed class A //密封类可以实例化,但不能继承 { public void BaseMethod() { Console.WriteLine("ABaseMethod"); } }
//class C:A //A是密封类,所以不能继承,只能实例化 所以此处编译时是错误的 //{ //}
class D { public void BaseMethod() { Console.WriteLine("DBaseMethod"); }
//public abstract void DAbstract() //抽象方法只能放在抽象类中,放在次类中是错误的 //{ // Console.WriteLine("DAbstract"); //}
}
//abstract class D //D是抽象类,所以不能实例化,只能继承,所以会在Main()函数中导致不能实例化的错误 //{ // public void BaseMethod() // { // Console.WriteLine("DBaseMethod"); // } //} abstract class E //E是抽象类,所以不能实例化,只能继承,要使用抽象类,必须继承这个类 { public void BaseMethod() //抽象类可以有非抽象方法等,并且可以提供成员的实现代码 { //可以用派生类的实例调用这个抽象类中的非抽象方法 Console.WriteLine("EBaseMethod"); }
public abstract void AbstractMethod(); //抽象类可以有抽象成员,比如抽象方法,但不能有抽象方法的主体,所以去掉了{} //而且抽象方法只能放在抽象类中,但没有实现代码,执行代码必须在派生类中实现
} class F:E { public override void AbstractMethod() //F类可以不实现这个方法,就是说派生类可以不完全实现抽象基类的抽象方法,但此时派生类必须也是抽象类 { Console.WriteLine("FAbstractMethod"); }
//public new void BaseMethod() //此时F的实例将调用自身的BaseMethod()方法,而不在调用继承自基类E的BaseMethod()方法 //{ //原因是因为用new保留字隐藏了基类的BaseMethod()方法,所以基类E的中BaseMethod()方法对派生类F是不可见的 // Console.WriteLine("FBaseMethod"); //} }
}//无法创建抽象类或接口的实例