在C#里,abstract类是一种不能被直接实例化的特殊类,主要用来为一组相关的子类提供统一的模板和公用逻辑。借助abstract类,我们可以把不变的部分放在基类,把变化的行为留给派生类去实现,从而降低重复代码并提升扩展性。

什么是abstract类
abstract类使用 abstract 关键字修饰。它可能存在抽象成员,也可能包含普通已实现的方法。由于本身不完整,编译器禁止我们使用 new 去创建它的对象。
abstract类的主要特征
- 不能实例化,只能被继承
- 可以包含抽象方法、抽象属性,也可以包含普通方法
- 子类必须实现所有抽象成员,除非子类也是abstract类
如何定义abstract类
下面给出一个最基础的写法,定义一个表示图形的abstract类,其中包含抽象方法计算面积。
using System;
// 抽象图形类
public abstract class Shape
{
// 抽象方法,没有方法体
public abstract double GetArea();
// 普通方法,子类可直接使用
public void PrintType()
{
Console.WriteLine("我是一个图形");
}
}
子类如何实现abstract类
派生类通过 override 关键字重写抽象成员。以下示例实现了圆形和矩形。
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double r)
{
Radius = r;
}
// 必须实现抽象方法
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
}
public class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public Rectangle(double w, double h)
{
Width = w;
Height = h;
}
public override double GetArea()
{
return Width * Height;
}
}
完整调用示例
虽然不能 new Shape(),但可以用父类变量指向子类对象,这是多态的常见用法。
class Program
{
static void Main()
{
Shape s1 = new Circle(2);
Shape s2 = new Rectangle(3, 4);
s1.PrintType();
Console.WriteLine("圆面积:" + s1.GetArea());
s2.PrintType();
Console.WriteLine("矩形面积:" + s2.GetArea());
}
}
abstract类使用建议
| 场景 | 是否适合用abstract类 |
|---|---|
| 多个类有共用逻辑且行为不完全一致 | 适合 |
| 只是想定义接口规范 | 更适合用interface |
| 需要被实例化直接使用 | 不适合 |
当项目中出现一组相似对象,且希望强制子类遵守某种结构时,abstract类就是非常合适的选择。它比普通基类更严格,又比接口更灵活,能携带已实现代码。