抽象类
指设计为被继承的类
抽象类只能作为其它类的基类
规则
- 不能创建抽象类的实例。
- 抽象类使用abstract修饰符声明。
例
abstract class MyClass
{
....
}
- 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带实现的成员的任意组合。
- 抽象类自己可以派生自另一个抽象类。例如,下面的代码展示了一个抽象类,它派生自另一个抽象类。
例
abstract class MyClass
{
....
}
abstract class MyAbClass:MyClass
{
....
}
- 任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类自己也是抽象类。
抽象成员
指设计为被覆写的函数成员
特征
- 必须是一个函数成员。也就是说,字段和常量不能为抽象成员。
- 必须用abstract修饰符标记。
- 不能有实现代码块。抽象成员的代码用分号表示。
语法
abstract public void PrintStuff(string s);
abstract public int MyProperty{
get;
set;
}
抽象成员只能在抽象类中声明
方法、属性、事件、索引四个类型成员可以声明为抽象
注意
- 尽管抽象成员必须在派生类中用相应的成员覆写,但不能把virtual修饰符附加到abstract修饰符。
- 类似虚成员,派生类中抽象成员的实现必须指定override修饰符。
比较虚成员和抽象成员
实例1
abstract class AbClass
{
public void IdentifyBase()
{
Console.WriteLine("AbClass");
}
abstract public void IdentifyDerived(); //抽象方法
}
class DerivedClass : AbClass //派生类
{
public override void IdentifyDerived()
{
Console.WriteLine("DerivedClass");
}
}
class Program
{
static void Main(string[] args)
{
DerivedClass b = new DerivedClass();
b.IdentifyBase();
b.IdentifyDerived();
Console.ReadKey();
}
}
结果
AbClass
DerivedClass
实例2
abstract class MyBase
{
public int SideLength = 10;
const int TriangleSideCount = 3;
abstract public void PrintSuff(string s);
abstract public int MyInt { get; set; }
public int PerimeterLength()
{
return TriangleSideCount * SideLength;
}
}
class MyClass : MyBase //派生类
{
public override void PrintSuff(string s)
{
Console.WriteLine($"DerivedClass.PrintSuff:{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.PrintSuff("this is a string");
mc.MyInt = 28;
Console.WriteLine($"mc.MyInt:{mc.MyInt}");
Console.WriteLine($"mc.PerimeterLength: {mc.PerimeterLength()}");
Console.ReadKey();
}
}
结果
DerivedClass.PrintSuff:this is a string
mc.MyInt:28
mc.PerimeterLength: 30