抽象类和接口※
抽象类和接口都是面向对象中定义规范/契约的机制,强制子类实现某些成员。
抽象类(abstract class)※
- 可以包含实现代码(具体方法)+ 抽象方法(只有声明无实现)
- 抽象成员必须由派生类 override 实现
- 不能被实例化(new)
- 单继承:一个类只能继承一个抽象类
public abstract class Animal
{
public string Name { get; set; }
public abstract void Speak(); // 抽象方法
public void Eat() { Console.WriteLine("Eating..."); } // 具体方法
}
public class Dog : Animal
{
public override void Speak() => Console.WriteLine("Woof");
}
接口(interface)※
- 只包含声明(方法/属性/事件的签名),不含实现(C# 8 后可默认实现)
- 多实现:一个类可以实现多个接口
- 表达"能做什么"的能力契约
public interface IFlyable
{
void Fly();
}
public class Bird : IFlyable
{
public void Fly() => Console.WriteLine("Flying");
}
选择※
- 需要共享实现代码 → 抽象类
- 需要多实现、纯契约 → 接口
- is-a 关系 → 抽象类;can-do 关系 → 接口