编程到接口或其他抽象类型
本文关键字:抽象 抽象类 类型 其他 接口 编程 | 更新日期: 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
是可用于构建基于interface
或contract
的体系结构的仪器。同样可以通过简单地使用 abstract base class
来实现,或者simple base class
与 virtual methods
。因此,"编程到接口":编程时考虑到从消费者代码中隐藏具体的实现细节(尽可能多),以确保程序的最大可维护性、灵活性和可调用性。使用interface
、abstract class
、base class
,随心所欲。
-
使用界面,您只需签名即可
-
使用抽象类,您可以设置子类的常见行为,因此编写通用代码
-
对于 C# 来说,多重继承是不可能的,所以
您可以实现多个接口,而不能继承多个抽象类
-
创建分发组件(如 WCF 远程处理等)时,将实现接口以便与客户端通信。
-
您可以使用接口来标记类