C# 编程到接口或其他抽象类型
在一份声明中说—— 这个问题的大多数答案都有一个普遍的误解,即 编程到接口意味着使用接口语言 建筑这是完全错误的!这是我看到的第一个答案 这正确地说明了对接口编程意味着: 不要不必要地将“客户代码”绑定到具体/特定的 子类实现,因为如果以后决定更改它,请使用 如果是另一种实现,那么要撤消所有 不必要的绑定。即编程/绑定到没有 实施细节。例如,抽象基类 请就这一点展开讨论,最好是针对c.示例: 如果你有一种让动物在你的手机游戏中奔跑的方法,你可以定义一个 IAnimal界面,并为每种动物定义自己的运行中文C# 编程到接口或其他抽象类型,c#,oop,interface,abstraction,C#,Oop,Interface,Abstraction,在一份声明中说—— 这个问题的大多数答案都有一个普遍的误解,即 编程到接口意味着使用接口语言 建筑这是完全错误的!这是我看到的第一个答案 这正确地说明了对接口编程意味着: 不要不必要地将“客户代码”绑定到具体/特定的 子类实现,因为如果以后决定更改它,请使用 如果是另一种实现,那么要撤消所有 不必要的绑定。即编程/绑定到没有 实施细节。例如,抽象基类 请就这一点展开讨论,最好是针对c.示例: 如果你有一种让动物在你的手机游戏中奔跑的方法,你可以定义一个 IAnimal界面,并为每种动物定义自己的
public interface IAnimal {
Run();
}
public Dog : IAnimal{
public void Run() {
//DOG RUN CHINEMATICS
}
}
public Elephant: IAnimal{
public void Run() {
//ELEPHANT RUN CHINEMATICS
}
}
因此,您将具体的实现隐藏在IAnimal抽象背后,它通常被称为接口契约
因此,在物理引擎运行期间,您可以简单地定义一种方法:
把它叫做:
RunAnimal(new Dog()); //WILL CALL DOG CONCRETE METHOD
RunAnimal(new Elephant()); //WILL CALL ELEPHANT CONCRETE METHOD
因此,对于RunAnimal方法,动物的具体实施细节隐藏在动物墙后面
编辑
那么,这个问题的答案是为什么对接口编程不只是使用接口构造?是:
接口是可用于构建接口或基于合同的体系结构的工具。同样可以通过使用抽象基类或带有虚拟方法的简单基类来实现。因此,编程到接口:是指通过尽可能多地从用户代码中隐藏具体的实现细节来编程,以确保程序的最大可维护性、灵活性和可伸缩性。使用接口、抽象类、基类,无论您想要什么。示例:
如果你有一种让动物在你的手机游戏中奔跑的方法,你可以定义一个
IAnimal界面,并为每种动物定义自己的运行中文
public interface IAnimal {
Run();
}
public Dog : IAnimal{
public void Run() {
//DOG RUN CHINEMATICS
}
}
public Elephant: IAnimal{
public void Run() {
//ELEPHANT RUN CHINEMATICS
}
}
因此,您将具体的实现隐藏在IAnimal抽象背后,它通常被称为接口契约
因此,在物理引擎运行期间,您可以简单地定义一种方法:
把它叫做:
RunAnimal(new Dog()); //WILL CALL DOG CONCRETE METHOD
RunAnimal(new Elephant()); //WILL CALL ELEPHANT CONCRETE METHOD
因此,对于RunAnimal方法,动物的具体实施细节隐藏在动物墙后面
编辑
那么,这个问题的答案是为什么对接口编程不只是使用接口构造?是:
接口是可用于构建接口或基于合同的体系结构的工具。同样可以通过使用抽象基类或带有虚拟方法的简单基类来实现。因此,编程到接口:是指通过尽可能多地从用户代码中隐藏具体的实现细节来编程,以确保程序的最大可维护性、灵活性和可伸缩性。使用接口,抽象类,基类,任何你想要的
有了接口,您就有了方法的签名
使用抽象类,您可以设置子类的公共行为,所以编写公共代码
对于C语言来说,多重继承是不可能的
您可以实现多个接口,而不是继承多个抽象类
当您创建分布式组件(如WCF远程处理等)时,您需要实现接口以便与客户端通信
您可以使用接口来标记类
有了接口,您就有了方法的签名
使用抽象类,您可以设置子类的公共行为,所以编写公共代码
对于C语言来说,多重继承是不可能的
您可以实现多个接口,而不是继承多个抽象类
当您创建分布式组件(如WCF远程处理等)时,您需要实现接口以便与客户端通信
您可以使用接口来标记类
我的解释是,答案只是扩展了接口的概念,即绑定到任何一组属性和方法,无论是纯接口,即C中的接口,还是绑定到特定实现。答案是,你可以自己考虑一个类一个接口,所以你应该编程到你需要使用的最低基类,一个泛型列表契约和一个更具体的ARARYList契约就是那个例子。
与不存在的ITextReader接口相比,绑定到抽象TextReader类的System.IO类中经常会看到这一点。我的解释是,答案只是将接口的概念扩展为绑定到任何一组属性和方法,无论是纯接口,即C中的接口还是绑定到特定的接口实施答案是,你可以自己考虑一个类一个接口,所以你应该编程到最低的基类T。 对于您的使用来说,什么是必要的?例如,通用列表契约与更具体的ArrayList契约
在绑定到抽象TextReader类的System.IO类和不存在的ITextReader接口的System.IO类中,您可以看到很多这种情况。那么,这与仅仅拥有一个基础抽象动物类有什么区别呢?@它在英语中的含义没有区别,只是具有不同的属性。其中一个最重要的问题是在接口的情况下,多重继承的可能性。这并不能真正回答这个问题。问题不是什么是编程到接口?而是为什么编程到接口不只是使用接口构造?@Alexander:对,因此我对使用抽象基类的评论,它可以达到同样的目的,但是有一个限制,你可以进行多重继承,除非你有一个非常复杂的继承树——即使如此,这也不是一回事。顺便说一句:我没有downvote@MattBurland:我更新了我的答案。那么这与仅仅有一个基础抽象动物类有什么区别呢?@它在英语中的意思没有区别,只是有不同的属性。其中一个最重要的问题是在接口的情况下,多重继承的可能性。这并不能真正回答这个问题。问题不是什么是编程到接口?而是为什么编程到接口不只是使用接口构造?@Alexander:对,因此我对使用抽象基类的评论,它可以达到同样的目的,但是有一个限制,你可以进行多重继承,除非你有一个非常复杂的继承树——即使如此,这也不是一回事。顺便说一句:我没有downvote@MattBurland:我更新了我的答案。他实际上只是指出除了“接口”之外的其他关键字提供多态性。他反对的是一种草人,但当你用c语言声明一个接口时,你要指定一个类将做什么,而不是它将如何做。通过将“如何”和“什么”分开,您可以更轻松地在以后替换“如何”,同时确保新模块的功能保持不变。他实际上只是指出,“接口”之外的其他关键字提供多态性。他反对的是一种草人,但当你用c语言声明一个接口时,你要指定一个类将做什么,而不是它将如何做。通过将“如何”和“什么”分开,您可以更轻松地在以后替换“如何”,同时确保新模块的功能保持不变。总结了几个不同之处。无论您使用的是接口还是抽象基类,您仍然在按照抽象进行编程,因为您没有耦合到任何特定的具体实现。使用其中一种或两者的决定取决于具体情况。感谢Ginosaji的补充,这取决于您的案例总结了一些差异。无论您使用的是接口还是抽象基类,您仍然在按照抽象进行编程,因为您没有耦合到任何特定的具体实现。使用其中一种或两者的决定取决于具体情况。感谢Ginosaji的补充,这取决于您的情况