抽象方法是一种没有方法体(没有具体实现)的方法,它只定义了方法的签名(返回类型、方法名、参数),而具体的实现留给派生类去完成。
csharp
// 抽象方法必须在抽象类中
public abstract class Animal
{
// 抽象方法:没有方法体,以分号结束
public abstract void MakeSound();
// 普通方法:可以有具体实现
public void Eat()
{
Console.WriteLine("动物正在进食");
}
}
| 特性 | 说明 |
|---|---|
| 无方法体 | 只有声明,没有 { } 和实现代码 |
| 必须在抽象类中 | 包含抽象方法的类必须标记为 abstract |
| 不能实例化 | 抽象类不能 new,只能作为基类使用 |
| 必须被重写 | 派生类必须用 override 实现所有抽象方法 |
| 不能是静态的 | 抽象方法是实例方法,不能加 static |
抽象方法的核心作用是定义规范,强制派生类实现特定行为:
csharp
// 抽象基类
public abstract class Animal
{
public string Name { get; set; }
// 抽象方法:每种动物的叫声不同
public abstract void MakeSound();
public void ShowInfo()
{
Console.Write($"{Name}: ");
MakeSound(); // 调用抽象方法,实际执行派生类的实现
}
}
// 派生类1:狗
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("汪汪汪!");
}
}
// 派生类2:猫
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("喵喵喵~");
}
}
// 派生类3:牛
public class Cow : Animal
{
public override void MakeSound()
{
Console.WriteLine("哞~~");
}
}
// 使用示例
class Program
{
static void Main()
{
List<Animal> animals = new List<Animal>
{
new Dog { Name = "旺财" },
new Cat { Name = "咪咪" },
new Cow { Name = "大黄" }
};
foreach (var animal in animals)
{
animal.ShowInfo();
}
// 输出:
// 旺财: 汪汪汪!
// 咪咪: 喵喵喵~
// 大黄: 哞~~
}
}
csharp
public abstract class Shape
{
// 抽象方法:计算面积
public abstract double GetArea();
// 抽象方法:计算周长
public abstract double GetPerimeter();
// 普通方法:显示信息
public void DisplayInfo()
{
Console.WriteLine($"面积: {GetArea():F2}, 周长: {GetPerimeter():F2}");
}
}
public class Circle : Shape
{
public double Radius { get; set; }
public Circle(double radius)
{
Radius = radius;
}
public override double GetArea()
{
return Math.PI * Radius * Radius;
}
public override double GetPerimeter()
{
return 2 * Math.PI * Radius;
}
}
public class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public Rectangle(double width, double height)
{
Width = width;
Height = height;
}
public override double GetArea()
{
return Width * Height;
}
public override double GetPerimeter()
{
return 2 * (Width + Height);
}
}
// 使用
Shape shape1 = new Circle(5);
Shape shape2 = new Rectangle(4, 6);
shape1.DisplayInfo(); // 面积: 78.54, 周长: 31.42
shape2.DisplayInfo(); // 面积: 24.00, 周长: 20.00
csharp
public abstract class Database
{
// 抽象方法:定义数据库操作的统一规范
public abstract void Connect();
public abstract void Disconnect();
public abstract void ExecuteQuery(string sql);
// 普通方法:公共操作逻辑
public void RunSafeQuery(string sql)
{
try
{
Connect();
Console.WriteLine("开始执行查询...");
ExecuteQuery(sql);
Console.WriteLine("查询执行完毕");
}
catch (Exception ex)
{
Console.WriteLine($"错误: {ex.Message}");
}
finally
{
Disconnect();
}
}
}
public class SqlServerDatabase : Database
{
public override void Connect()
{
Console.WriteLine("连接到 SQL Server 数据库");
}
public override void Disconnect()
{
Console.WriteLine("断开 SQL Server 连接");
}
public override void ExecuteQuery(string sql)
{
Console.WriteLine($"在 SQL Server 中执行: {sql}");
// 实际的 SQL Server 执行逻辑
}
}
public class MySqlDatabase : Database
{
public override void Connect()
{
Console.WriteLine("连接到 MySQL 数据库");
}
public override void Disconnect()
{
Console.WriteLine("断开 MySQL 连接");
}
public override void ExecuteQuery(string sql)
{
Console.WriteLine($"在 MySQL 中执行: {sql}");
// 实际的 MySQL 执行逻辑
}
}
// 使用:统一的调用方式
Database db = new SqlServerDatabase();
db.RunSafeQuery("SELECT * FROM Users");
db = new MySqlDatabase();
db.RunSafeQuery("SELECT * FROM Products");
| 对比维度 | 抽象方法 | 虚方法 |
|---|---|---|
| 是否有默认实现 | ❌ 无 | ✅ 有 |
| 是否需要 override | ✅ 必须 | ❌ 可选 |
| 类是否必须抽象 | ✅ 是 | ❌ 否(可存在于普通类) |
| 方法体 | 无(只有分号) | 有({ } 内含代码) |
| 作用 | 强制派生类实现 | 提供可选覆盖点 |
csharp
public abstract class Base
{
public abstract void MustImplement(); // 必须重写
public virtual void CanOverride() // 可选重写
{
Console.WriteLine("默认实现");
}
}
抽象类不能实例化
csharp// Animal animal = new Animal(); // ❌ 编译错误
Animal animal = new Dog(); // ✅ 可以指向派生类
派生类必须实现所有抽象方法
csharp public class Bird : Animal
{
// 如果忘记实现 MakeSound(),编译会报错
public override void MakeSound() { } // 必须实现
}
csharp public interface IFlyable
{
void Fly();
}
public abstract class Bird : Animal, IFlyable
{
public abstract void Fly(); // 实现接口的抽象方法
}
抽象方法是只声明不实现的方法,强制派生类必须提供具体实现。它的核心作用是定义规范、实现多态,让不同子类拥有相同的行为入口但表现出不同的行为。
本文作者:ZeroEngineer
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!