抽象类
抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。
- 不能创建抽象类的实例。
- 抽象类使用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