abstract
关键字定义,不能被实例化,通常包含普通方法(有实现)和抽象方法(无实现)。interface
关键字定义,默认所有方法都是 public
且没有实现(C# 8.0 及以上支持默认实现)。csharp// 抽象类
abstract class Animal
{
public abstract void MakeSound(); // 抽象方法
public void Sleep() // 具体方法
{
Console.WriteLine("Sleeping...");
}
}
// 接口
interface IAnimal
{
void MakeSound(); // 只能定义方法签名(C# 8.0 之前)
}
特性 | 抽象类 | 接口 |
---|---|---|
字段 | 允许 | 不允许(C# 8.0+ 允许 static 字段) |
构造函数 | 允许 | 不允许 |
普通方法 | 允许 | 不允许(C# 8.0+ 允许默认实现) |
抽象方法 | 允许 | 只允许方法签名 |
访问修饰符 | 允许 public/protected/private | 默认 public |
csharpabstract class Animal // 抽象类
{
public abstract void MakeSound();
}
interface IFlyable // 接口
{
void Fly();
}
class Bird : Animal, IFlyable // 继承抽象类,同时实现接口
{
public override void MakeSound() { Console.WriteLine("Chirp Chirp"); }
public void Fly() { Console.WriteLine("Flying..."); }
}
抽象类:
Sleep()
)。Animal
类。接口:
IFlyable
可以应用于 Bird
和 Airplane
。IDisposable
、IComparable
。区别点 | 抽象类 | 接口 |
---|---|---|
继承 | 只能单继承 | 支持多实现 |
成员 | 允许字段、构造函数、普通方法 | 只能有方法签名(C# 8.0+ 允许默认实现) |
适用场景 | 适合同类对象的基本实现 | 适合无关对象的行为规范 |
如果类之间是 “是一种”(is-a)关系,如 Dog : Animal
,用抽象类;
如果类之间是 “能做什么”(can-do)关系,如 Bird : IFlyable
,用接口。
本文作者:xuxuxuJS
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!