在其他答案中,重要的是要注意接口通常应该封装尽可能少的逻辑来执行相关操作。一个非常简单的例子:
public IVehicle
{
void Start();
void Stop();
void Accelerate();
void Decelerate();
void TurnLeft();
void TurnRight();
void Reverse();
}
public interface IAeronauticVehicle : IVehicle
{
void TakeOff();
void Land();
void Ascend();
void Descend();
}
然后你可以有
public class Car : IVehicle
{
// ... implementation ...
}
public class Airplane : IAeronauticVehicle
{
// ... similar IVehicle implementation
// ... and then the IAeronauticVehicle implementation
// You could even nullify certain IVehicle methods that don't apply:
public void Reverse()
{
throw new NotSupportedException();
}
}
这是一个非常人为的示例,但它说明了您的 IVehicle 接口不需要关注可能仅适用于 IAeronauticVehicle 实现的扩展属性或方法。您可以稍后添加。通过这样做,您可以扩展您的 Airplane 类和任何使用 IAeronauticVehicle 的代码的功能,而无需更改 IVehicle 定义的基本合同
一个典型的例子是 IEnumerable 接口,它只定义了一个方法GetEnumerator
。任何类,无论目的如何,如果它打算返回一组可枚举的项,都可以实现这个接口。这样一来,这个类就可以在任何支持 IEnumerable 的地方立即可用。使用您的 IEnumerable 实现的代码并不关心您的类上的任何其他方法,例如您的类定义的任何FetchRecordsFromDatabase()
其他方法。ValidateInput()
接口不应该是包罗万象的,因此必须(几乎)永远不会出现必须更改接口的问题。