Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编程到接口或其他抽象类型_C#_Oop_Interface_Abstraction - Fatal编程技术网

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

C# 编程到接口或其他抽象类型,c#,oop,interface,abstraction,C#,Oop,Interface,Abstraction,在一份声明中说—— 这个问题的大多数答案都有一个普遍的误解,即 编程到接口意味着使用接口语言 建筑这是完全错误的!这是我看到的第一个答案 这正确地说明了对接口编程意味着: 不要不必要地将“客户代码”绑定到具体/特定的 子类实现,因为如果以后决定更改它,请使用 如果是另一种实现,那么要撤消所有 不必要的绑定。即编程/绑定到没有 实施细节。例如,抽象基类 请就这一点展开讨论,最好是针对c.示例: 如果你有一种让动物在你的手机游戏中奔跑的方法,你可以定义一个 IAnimal界面,并为每种动物定义自己的

在一份声明中说——

这个问题的大多数答案都有一个普遍的误解,即 编程到接口意味着使用接口语言 建筑这是完全错误的!这是我看到的第一个答案 这正确地说明了对接口编程意味着: 不要不必要地将“客户代码”绑定到具体/特定的 子类实现,因为如果以后决定更改它,请使用 如果是另一种实现,那么要撤消所有 不必要的绑定。即编程/绑定到没有 实施细节。例如,抽象基类

请就这一点展开讨论,最好是针对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的补充,这取决于您的情况