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

本文关键字:抽象 抽象类 类型 其他 接口 编程 | 更新日期: 2023-09-27 17:56:26

在关于接口编程的SO问题中,评论者说 -

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

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

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

我的解释是,答案只是扩展了"接口"的概念,意味着绑定到任何一组属性和方法,无论是"纯"接口(即 C# 中的interface)还是绑定到特定实现。 答案的要点是,您可以将类本身视为"接口",因此您应该编程到使用所需的最低基类(通用List协定与更具体的ArrayList协定就是这个例子)。

在绑定到抽象TextReader类与(不存在的)ITextReader接口的类System.IO中,你经常看到这一点。

示例:

如果你有一个方法可以让"动物"在你的移动游戏中运行,你可以定义一个 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 class 来实现,或者simple base classvirtual methods 。因此,"编程到接口":编程时考虑到从消费者代码中隐藏具体的实现细节(尽可能多),以确保程序的最大可维护性、灵活性可调用性。使用interfaceabstract classbase class,随心所欲。

  1. 使用界面,您只需签名即可

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

  3. 对于 C# 来说,多重继承是不可能的,所以

您可以实现多个接口,而不能继承多个抽象类

  1. 创建分发组件(如 WCF 远程处理等)时,将实现接口以便与客户端通信。

  2. 您可以使用接口来标记类

相关文章: