在a SO question on interface programming中commenter说 -
这个问题的大多数答案都有一个常见的误解 "编程到界面"意思是使用界面语言 构造;这完全错了!这是我见过的第一个答案 这正确地说明了"编程到接口"手段: 不要不必要地绑定您的客户代码'具体/具体 子类实现,因为如果你以后决定改变它使用 一个不同的实现,你有更多的工作撤消所有 不必要的绑定。即程序/绑定到没有的东西 实施细节。例如。抽象基类。;)
有些人可以扩展这一点,最好是与c#相关。
答案 0 :(得分:3)
我的解释是,答案只是扩展“接口”的概念,意味着绑定到任何属性和方法集,无论是“纯”接口(即interface
in C#)或绑定到特定的实现。答案的重点是,可以将类视为一个“接口”,因此您应该编程到使用所需的最低基类(通用List
合同一个更具体的ArrayList
合同就是那个例子。)
您在System.IO
类中看到了很多绑定到抽象TextReader
类而不是(不存在)ITextReader
接口的内容。
答案 1 :(得分:2)
示例:
如果您有一种方法可以在您的手机游戏中运行“动物”,则可以定义一个
IAnimal
界面,并为每个动物定义自己的运行运动学。
public interface IAnimal {
Run();
}
public Dog : IAnimal{
public void Run() {
//DOG RUN CHINEMATICS
}
}
public Elephant: IAnimal{
public void Run() {
//ELEPHANT RUN CHINEMATICS
}
}
所以你隐藏 IAnimal
抽象背后的具体实现(通常称为接口合约)。
因此,在物理引擎运行期间,您只需定义一个方法:
public void RunAnimal(IAnimal animal) {
animal.Run();
}
并称之为:
RunAnimal(new Dog()); //WILL CALL DOG CONCRETE METHOD
RunAnimal(new Elephant()); //WILL CALL ELEPHANT CONCRETE METHOD
因此,对于RunAnimal
方法,动物的具体建筑细节隐藏在IAnimal
“墙”后面。
编辑
所以问题的答案“为什么编程到接口而不是简单地使用接口构造?”是:
interface
和工具可用于构建基于interface
或contract
的架构。只需使用abstract base class
或simple base class
virtual methods
即可实现同样的目标。所以“编程到接口”:编程是通过考虑从消费者代码中隐藏具体的实现细节(尽可能多),以确保最大的可维护性,灵活性和可扩展性您的计划。使用interface
,abstract class
,base class
,无论您想要什么。
答案 2 :(得分:2)
使用界面,您只需签署方法
使用抽象类,您可以设置子类的常见行为,因此编写公共代码
C#所以不可能进行多重继承
您可以实现多个接口而不是继承多个抽象类
当您创建分布式组件(如WCF Remoting等)时,您实现接口以便与您的客户进行通信。
您可以使用界面标记班级