接口定义了一个类必须能够做某事。这意味着您知道正在处理的对象将执行您想要执行的操作。它让您有更大的自由度,是 OOP 的优势之一。这是一个很深的话题,但一个非常基本的例子是:
public interface IAnimal
{
string Speak();
}
public class Dog : IAnimal
{
public string Speak()
{
return "Woof, woof";
}
}
public class Cat : IAnimal
{
public string Speak()
{
return "Meow";
}
}
public class Parrot : IAnimal
{
public string Speak()
{
return "Sqwark!";
}
}
然后你可以使用任何你喜欢的动物!
class Program
{
static void Main(string[] args)
{
// Writes Woof, Woof
IAnimal animal = new Dog();
Console.WriteLine(animal.Speak());
// Now writes Meow
animal = new Cat();
Console.WriteLine(animal.Speak());
// Now writes Sqwark etc
animal = new Parrot();
Console.WriteLine(animal.Speak());
}
}
这也允许你进入控制反转之类的事情,你可以像这样拿一个物品,你可以通过一只狗、猫或鹦鹉,这种方法总是有效的,不知道或不关心它是哪种动物:
public void ShoutLoud(IAnimal animal)
{
MessageBox.Show("Shout " + animal.Speak());
}
这使得 ShoutLoud可以进行单元测试,因为您可以使用模拟对象而不是真实的动物。它基本上使您的代码灵活和动态,而不是僵化和紧密耦合。
另外,扩展马修的问题。在 C# 中,您只能从一个基类继承,但可以有多个接口。所以,你可以有:
public class Dog : IAnimal, IMammal, ICarnivor
这允许您拥有小型界面(推荐),然后允许您进行构建,从而最大限度地控制项目可以/必须做什么。