为什么我们要使用接口?
仅仅是为了标准化吗?
类比1:就像美国航天飞机、俄罗斯联盟号宇宙飞船和中国神舟五号都可以对接国际空间站,因为它们实现了相同的对接接口。(这只是一个例子——我不知道在现实生活中是否真的如此,但为了举例子而悬置我们的怀疑)
类比2:就像你可以将各种计算机显示器插入家用电脑一样。你可以将墙壁大小的电视机、旧式CRT(厚的那种)、20英寸平板屏幕或盲人用的点字机插入其中。这些不同设备与你的计算机具有兼容性,因为它们都遵循接口标准。
C#接口的详细信息——使用C#/OOP接口,你正在做相同类型的事情,但是在看不见/虚拟的世界中。
你关于标准化的想法是正确的,但还需要考虑灵活性、可伸缩性、可扩展性、可维护性、可重用性、可测试性和功能强大等因素。接口用于描述一个实现的事物能做什么。因此,您可以将实现了同一接口的多个对象视为该接口类型的一种。
例如:
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
它,而无需知道其确切类型。 - supercat这是为了接口设计,让你可以在不同的设备之间进行连接。当你有多个相同设备的实现时,它非常有用。当你需要将一个接口应用于多个不同的类时,因为你需要一些约定,这些类将能够做一些事情或具有某些功能。
这是一个高层次的概述...
接口在信息隐藏的概念中扮演着重要的角色。
它们基本上帮助您隐藏类的实现细节,以便调用类不依赖于该实现。因此,通过使用接口,您可以修改实现而不更改调用类。这反过来又限制了代码的复杂性,使其在长期内更易于维护。
当我开始理解接口时,它们被解释为“提供描述您的类的合同”。不确定是否会对您有所帮助,但如果您认为汽车接口可以说它驾驶,刹车和转向。因此,只要它能将我从A点带到B点,我就不必知道这些功能是如何实现的。
接口有些尴尬。它们通过相信相同的名称和实现的接口意味着相同的行为来支持契约设计。这仅得益于API文档,必须经过人工检查。这使得接口太弱。解决这个问题的一种方法可能是正式规范。 另一方面,接口太强、太严格了。您无法演变接口,这经常妨碍重用。这通过协议来解决-动态语言中的机制,发送消息(调用方法),当接收器不支持该消息时,会调用标准回调。 具有约束条件的具体协议可能更好。
思考远程调用...
这里涉及到客户端和服务器。假设它们被互联网物理隔离。客户端调用一个方法,其实际执行发生在服务器上。从客户端的角度来看,客户端不知道执行操作的服务器对象的任何信息。但是它知道要调用哪个方法。因为在构建客户端程序时,我们只暴露了一个接口(或契约)。我们没有暴露实际存在于服务器上的整个对象。尝试在 .net 远程调用中进行一些演示应用程序,您就会明白剩下的部分。祝编程愉快。
如果有人和我一样,更喜欢通过实例和实践来学习,而不仅仅是听解释的话,这里有一些代码...
我发现了这个使用C#实现神经网络的项目,包括项目下载,它以一种优雅且有用的方式利用了接口: