【发布时间】:2011-01-02 19:41:23
【问题描述】:
我们为什么要使用接口?
只是为了标准化吗?
【问题讨论】:
-
而不是...?接口有很多用途...
-
我真的希望人们不要在非 c# 特定的帖子上放置 c# 之类的标签。这是一个非常好的问题,我可能错过了,因为 c# 是一个被忽略的标签。
我们为什么要使用接口?
只是为了标准化吗?
【问题讨论】:
类比1:很像美国的航天飞机,俄罗斯的联盟号飞船和中国的神舟五号都可以对接国际空间站,因为它们实现了相同的对接接口。 (这只是一个例子——我不知道这在现实生活中是否属实,但为了一个例子,让我们暂停我们的怀疑)
类比 2:就像您可以将各种计算机显示器插入家用计算机一样。您可以将壁挂式电视、旧 CRT(较厚的那种)、20 英寸纯平屏幕或盲人盲文机插入其中以通过触摸“看到”。这些不同/不同的设备和您的计算机,因为他们都同意接口标准。
Details of C# interfaces -- 使用 C#/OOP 接口,您可以做同样的事情,但在看不见的/虚拟世界中。
您对标准化是正确的,但灵活性、可扩展性、可扩展性、可维护性也是正确的、可重用性、可测试性和能力。
(您使用软件界面的次数越多,这些“流行语”就会被理解得越多。并且始终考虑现实世界中的界面,因为它们对我们同样出色。)
【讨论】:
standardization, but also flexibility, scalability, extensibility, maintainability, reusability, testability and power.
接口用于描述实现的事物可以做什么。因此,您可以将实现相同接口的多个对象视为该接口的一种类型。
例如:
public interface IMyInterface{
public void DoFirst();
public int DoSecond();
}
public class A : IMyInterface{
//class has to implement DoFirst and DoSecond
public void DoFirst(){
Console.WriteLine("Blubb1");
}
public int DoSecond(){
Console.WriteLine("Blubb2");
return 2;
}
}
public class B : IMyInterface{
//class has to implement DoFirst and DoSecond
public void DoFirst(){
Console.WriteLine("Blibb1");
}
public int DoSecond(){
Console.WriteLine("Blibb2");
return 4;
}
}
类以多种方式实现接口。但是您可以将它们用作 IMyInterface。 例如:
public static void DoMethodsInInterface(IMyInterface inter){
inter.DoFirst();
inter.DoSecond();
}
public static void main(){
DoMethodsInInterface(new A());
DoMethodsInInterface(new B());
//Or use it in a List
List<IMyInterface> interlist = new List<IMyInterface>();
interlist.Add(new A());
interlist.Add(new B());
foreach(IMyInterface inter in interlist){
inter.DoFirst();
}
}
我希望这能说明接口为什么有用。
【讨论】:
Woozle,任何想要接受对任一类和Woozle的引用的代码都必须知道它正在处理哪个类,并且只能Woozle对其进行分类知道。相比之下,如果两个类都实现了IWoozler,那么给出任何IWoozler 的代码就可以Woozle 它而无需知道它的确切类型。
它是用于接口的:),这样你就可以在东西之间进行接口,当你有的时候它很有用
【讨论】:
这是高级视图...
接口在Information Hiding 的概念中扮演着重要角色。
它们基本上可以帮助您隐藏类的实现细节,这样调用类就不会依赖于该实现。因此,通过使用接口,您可以在不更改调用类的情况下修改实现。这一切反过来限制了代码的复杂性,并使其更容易维护从长远来看。
当我第一次开始理解接口时,他们被解释为“提供类描述的合同”。不确定这是否会对您有所帮助,但如果您想到汽车的界面,您可以说它驱动、休息和转弯。所以只要它让我从 A 点到 B 点,我真的不需要知道这些功能是如何实现的。
【讨论】:
在 C#/Java 等语言中使用接口的主要原因是这些语言不支持多重(类)继承(请参阅What is the exact problem with multiple inheritance?)。
但允许多个(接口)实现允许以不同方式使用类。
【讨论】:
界面有些尴尬。 他们只相信同一个名字和实现的接口就意味着同一个行为,就支持契约式设计。这要归功于 API 文档,它必须经过人工检查。这使得接口太弱了。解决这个问题的一种方法可能是正式规范。 另一方面,接口太强大,太严格。你不能发展经常妨碍重用的接口。这是通过协议解决的 - 动态语言中的机制,它发送消息(调用方法),当接收者不支持该消息时,调用标准回调。 拥有带有约束的具体协议会更好。
【讨论】:
想想remoting...
这里涉及到一个客户端和一个服务器。可以说它们在物理上被互联网分开。客户端正在调用一个实际执行发生在服务器上的方法。从客户端的角度来看,客户端对执行执行的服务器中的对象一无所知。但是它知道要调用什么方法。因为在构建客户端程序时,我们只接触到一个接口(或契约)。我们没有接触到实际存在于服务器上的整个对象。尝试在 .net remoting 中做一些演示应用程序,剩下的你就知道了。快乐编程。
【讨论】:
我们为什么要使用接口?
某些语言使用 vtables 实现多态方法调用,并丢弃大部分类型信息,这使得 不 难以定义接口。
所以有时我们只是使用接口,因为语言设计需要它。
【讨论】:
从一个接口开始,你可以实现一个proxy,从而允许延迟加载或在调用具体实现的方法时执行一些验证。
【讨论】:
接口将数据类型与实现逻辑分开。
【讨论】:
接口提供仅包含特定行为功能声明的原型模式。
如果你想在类中实现这个行为,那么你必须在类中实现这个接口,那么类就有这个行为功能,或者它可以有多个行为。
因为类可以实现多个接口。
【讨论】:
如果其他人像我一样通过示例和实践来学习,而不仅仅是解释,这里有一些代码......
我发现这个用 C# 实现的神经网络,包括项目下载,它以一种优雅而有用的方式使用接口:
【讨论】: