抽象类
抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。
- 不能创建抽象类的实例。
- 抽象类使用abstract修饰符声明。
- 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带
实现的成员的任意组合。 - 抽象类自己可以派生自另一个抽象类。例如,下面的代码展示了一个抽象类,它派生自
另一个抽象类。
- 任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类
自己也是抽象类。
抽象类抽象方法的示例
下面的代码展示了一个名为AbClass的抽象类,它有两个方法。
第一个方法是一个带有实现的普通方法,它打印出类型的名称。第二个方法是一个必须在派
生类中实现的抽象方法。类DerivedClass继承AbClass,实现并覆写了抽象方法。创建
DerivedClass的对象并调用它的两个方法。
abstract class AbClass //抽象类
{public void IdentifyBase() //普通方法{Console.WriteLine("I am AbClass");}abstract public void IdentifyBase(); //抽象方法
}class DerivedClass:AbClass //派生类
{override public void IdentifyDerived() //抽象方法的实现{Console.WriteLine("I am DerivedClass");}
}class Program
{static void Main(){//AbClass a=new AbClass(); //错误,抽象类不能实例化//a.IdentifyDerived();DerivedClass b=new DerivedClass();//实例化派生类b.IdentifyBase(); //调用继承的方法b.IdentifyDerived(); //调用“抽象”ff}
}
输出结果:
I am AbClass
I am DerivedClass
抽象类的另一个例子
如下代码演示了包含数据成员和函数成员的抽象类的声明。记住,数据成员(字段和常量)
不可以声明为abstract。
abstract class MyBase //抽象和非抽象成员的组合
{public int SideLength=10; //数据成员const int TriangleSideCount=3; //数据成员abstract public void PrintStuff(string s); //抽象方法abstract public int MyInt{get;set;} //抽象属性public int PerimeterLength() //普通的非抽象方法{return TriangleSideCount*SideLength;}
}class MyClass:MyBase
{public override void PrintStuff(string s) //覆盖抽象方法{Console.WriteLine(s);}private int _myInt;public override int MyInt //覆盖抽象属性{get{return _myInt;}set{_myInt=value;}}
}class Program
{static void Main(string[] args){MyClass mc=new MyClass();mc.PrintStuff("This is a string.");mc.MyInt=28;Console.WriteLine(mc.MyInt);Console.WriteLine($"Perimeter Length:{mc.PerimeterLength()}")}
}
运行结果
This is a string
28
Perimeter Length:30