编程到接口或其他抽象类型

时间:2013-01-28 15:42:10

标签: c# oop interface abstraction

a SO question on interface programmingcommenter说 -

  

这个问题的大多数答案都有一个常见的误解   "编程到界面"意思是使用界面语言   构造;这完全错了!这是我见过的第一个答案   这正确地说明了"编程到接口"手段:   不要不必要地绑定您的客户代码'具体/具体   子类实现,因为如果你以后决定改变它使用   一个不同的实现,你有更多的工作撤消所有   不必要的绑定。即程序/绑定到没有的东西   实施细节。例如。抽象基类。;)

有些人可以扩展这一点,最好是与c#相关。

3 个答案:

答案 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工具可用于构建基于interfacecontract的架构。只需使用abstract base classsimple base class virtual methods即可实现同样的目标。所以“编程到接口”:编程是通过考虑从消费者代码中隐藏具体的实现细节(尽可能多),以确保最大的可维护性灵活性可扩展性您的计划。使用interfaceabstract classbase class,无论您想要什么。

答案 2 :(得分:2)

  1. 使用界面,您只需签署方法

  2. 使用抽象类,您可以设置子类的常见行为,因此编写公共代码

  3. C#所以不可能进行多重继承

  4. 您可以实现多个接口而不是继承多个抽象类

    1. 当您创建分布式组件(如WCF Remoting等)时,您实现接口以便与您的客户进行通信。

    2. 您可以使用界面标记班级