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");
//}
}
}
//无法创建抽象类或接口的实例