abstract(C# 参考)
abstract(C# 参考)
abstract
修饰符指示被修改内容的实现已丢失或不完整。 abstract 修饰符可用于类、方法、属性、索引和事件。 在类声明中使用
abstract
修饰符来指示某个类仅用作其他类的基类,而不用于自行进行实例化。 标记为抽象的成员必须由派生自抽象类的非抽象类来实现。
示例 1
在此示例中,类
Square
必须提供
GetArea
的实现,因为它派生自
Shape
:
C#复制
abstract class Shape
public abstract int GetArea();
class Square : Shape
private int _side;
public Square(int n) => _side = n;
// GetArea method is required to avoid a compile-time error.
public override int GetArea() => _side * _side;
static void Main()
var sq = new Square(12);
Console.WriteLine($"Area of the square = {sq.GetArea()}");
// Output: Area of the square = 144
抽象类具有以下功能:
- 抽象类不能实例化。
- 抽象类可能包含抽象方法和访问器。
-
无法使用
sealed
修饰符来修改抽象类,因为两个修饰符的含义相反。
sealed
修饰符阻止类被继承,而abstract
修饰符要求类被继承。 - 派生自抽象类的非抽象类,必须包含全部已继承的抽象方法和访问器的实际实现。
在方法或属性声明中使用
abstract
修饰符,以指示该方法或属性不包含实现。
抽象方法具有以下功能:
- 抽象方法是隐式的虚拟方法。
- 只有抽象类中才允许抽象方法声明。
-
由于抽象方法声明不提供实际的实现,因此没有方法主体;方法声明仅以分号结尾,且签名后没有大括号 ({ })。 例如:
C#复制
public abstract void MyMethod();
实现由方法 override 提供,它是非抽象类的成员。 - 在抽象方法声明中使用 static 或 virtual 修饰符是错误的。
除了声明和调用语法方面不同外,抽象属性的行为与抽象方法相似。
-
在静态属性上使用
abstract
修饰符是错误的。 - 通过包含使用 override 修饰符的属性声明,可在派生类中重写抽象继承属性。
有关抽象类的详细信息,请参阅 抽象类、密封类及类成员 。
抽象类必须为所有接口成员提供实现。
实现接口的抽象类有可能将接口方法映射到抽象方法上。 例如:
C#复制
interface I
void M();
abstract class C : I
public abstract void M();
示例 2
在此示例中,类
DerivedClass
派生自抽象类
BaseClass
。 抽象类包含抽象方法
AbstractMethod
,以及两个抽象属性
X
和
Y
。
C#复制
// Abstract class
abstract class BaseClass
protected int _x = 100;
protected int _y = 150;
// Abstract method
public abstract void AbstractMethod();
// Abstract properties
public abstract int X { get; }
public abstract int Y { get; }
class DerivedClass : BaseClass
public override void AbstractMethod()
_x++;
_y++;
public override int X // overriding property
return _x + 10;
public override int Y // overriding property
return _y + 10;
static void Main()
var o = new DerivedClass();
o.AbstractMethod();