Abstract (抽象类)和 Interface (接口)的区别
在.NET中, Abstract (抽象类)和 Interface (接口)有以下区别:
定义和语法
- 抽象类:用 abstract 关键字修饰,包含抽象成员(抽象方法、属性等)和非抽象成员。
- 接口:用 interface 关键字定义,只能包含方法、属性、事件等成员的签名,不能有实现。
继承和实现
- 抽象类:只能单继承,即一个类只能继承一个抽象类。
- 接口:可以多实现,一个类可以实现多个接口。
成员实现
- 抽象类:抽象成员在抽象类中不提供实现,由子类实现;非抽象成员有具体实现。
- 接口:所有成员都没有实现,由实现接口的类来实现。
访问修饰符
- 抽象类:成员可以有各种访问修饰符,如 public 、 private 、 protected 等。
- 接口:成员默认是 public ,不能显式指定其他访问修饰符。
应用场景
- 抽象类:用于表示一组相关类的共同特征和行为,提供部分实现,子类可以在此基础上进行扩展和定制。
- 接口:用于定义一组规范或契约,不同类型的类可以通过实现接口来表明它们支持特定的行为。
以下是一个简单的代码案例:
csharp
// 抽象类
abstract class Animal
{
public abstract void MakeSound();
public void Eat()
{
Console.WriteLine("动物在吃东西。");
}
}
// 接口
interface IRunable
{
void Run();
}
// 狗类,继承自抽象类Animal,实现接口IRunable
class Dog : Animal, IRunable
{
public override void MakeSound()
{
Console.WriteLine("汪汪汪!");
}
public void Run()
{
Console.WriteLine("狗在奔跑。");
}
}
class Program
{
static void Main()
{
Dog dog = new Dog();
dog.MakeSound();
dog.Eat();
dog.Run();
}
}
在这个案例中, Animal 是抽象类,有抽象方法 MakeSound 和非抽象方法 Eat 。 IRunable 是接口,定义了 Run 方法。 Dog 类继承 Animal 并实现 IRunable ,必须实现 Animal 中的抽象方法 MakeSound 和 IRunable 中的 Run 方法。通过这个案例可以看到抽象类和接口的不同作用,抽象类提供了部分实现和公共行为,接口定义了特定的行为规范,使得不同类可以按照统一的接口来实现特定功能。