1. 接口的定义与实现
接口(Interface)是一个抽象类型,定义了一组方法和属性的契约(规范),但不包含任何实现。类或结构可以实现一个或多个接口。
-
接口的定义
public interface IFlyable { void Fly(); }
-
实现接口
public class Bird : IFlyable { public void Fly() { Console.WriteLine("Bird is flying."); } } public class Airplane : IFlyable { public void Fly() { Console.WriteLine("Airplane is flying."); } }
-
使用接口
IFlyable bird = new Bird(); bird.Fly(); // 输出:Bird is flying. IFlyable airplane = new Airplane(); airplane.Fly(); // 输出:Airplane is flying.
在这个例子中,IFlyable
接口定义了一个 Fly
方法,Bird
和 Airplane
类实现了该接口并提供了具体实现。
2. 抽象类与抽象方法
抽象类是一个不能被实例化的类,包含至少一个抽象方法(不包含方法体)。抽象类可以包含字段、属性和已实现的方法。
-
抽象类的定义
public abstract class Animal { public string Name { get; set; } // 抽象方法 public abstract void MakeSound(); }
-
派生类实现抽象方法
public class Dog : Animal { public override void MakeSound() { Console.WriteLine("Dog barks."); } } public class Cat : Animal { public override void MakeSound() { Console.WriteLine("Cat meows."); } }
-
使用抽象类
Animal dog = new Dog(); dog.MakeSound(); // 输出:Dog barks. Animal cat = new Cat(); cat.MakeSound(); // 输出:Cat meows.
在这个例子中,Animal
是一个抽象类,定义了一个抽象方法 MakeSound
。Dog
和 Cat
类继承自 Animal
并实现了 MakeSound
方法。
3. 接口与抽象类的区别
-
目的
- 接口:定义一组契约,任何实现接口的类都必须实现这些契约。接口更注重行为。
- 抽象类:用于描述具有共同行为和状态的一组对象。抽象类更注重对象的共有特性。
-
实现
- 接口:类可以实现多个接口。
- 抽象类:类只能继承一个抽象类(因为 C# 不支持多重继承)。
-
成员
- 接口:只包含方法、属性、事件和索引器的声明,不包含实现。
- 抽象类:可以包含字段、已实现的方法、属性、构造函数等。
-
适用场景
- 接口:当需要定义一组行为并希望不同的类以不同方式实现这些行为时。
- 抽象类:当具有相似特性的类共享某些方法或状态,并希望提供部分实现时。
-
示例代码对比
接口示例
public interface IDrawable { void Draw(); } public class Circle : IDrawable { public void Draw() { Console.WriteLine("Drawing a circle."); } } public class Square : IDrawable { public void Draw() { Console.WriteLine("Drawing a square."); } }
抽象类示例
public abstract class Shape { public string Color { get; set; } public abstract void Draw(); } public class Circle : Shape { public override void Draw() { Console.WriteLine("Drawing a circle."); } } public class Square : Shape { public override void Draw() { Console.WriteLine("Drawing a square."); } }
总结
- 接口的定义与实现:接口定义了行为的契约,类通过实现接口来提供具体的行为。
- 抽象类与抽象方法:抽象类定义了对象的共同特性和行为,派生类实现抽象类中的抽象方法。
- 接口与抽象类的区别:接口注重行为的契约,可以多重实现;抽象类注重对象的共同特性,只能单一继承。