【发布时间】:2016-06-03 19:00:34
【问题描述】:
我知道接口引用变量可以引用任何实现其接口的对象。但是使用参考变量的实际用途是什么?我们可以通过使用对象来达到同样的效果,那为什么要使用引用变量呢?
【问题讨论】:
-
@TeodorIvanov 我之前在 Google 上没有找到这个。无论如何谢谢你
我知道接口引用变量可以引用任何实现其接口的对象。但是使用参考变量的实际用途是什么?我们可以通过使用对象来达到同样的效果,那为什么要使用引用变量呢?
【问题讨论】:
这个问题有很多解释的余地,但这是我的问题:
每个对象变量在C#中其实是一个引用变量:
MyClass c = new MyClass();
IMyInterface i = new MyClassThatImplementsInterface();
object o = new object();
以上都是引用变量,因为它们“指向”引用类型。我想你的问题是指:我为什么要写
IMyInterface i = new MyClassThatImplementsInterface();
而不是
MyClassThatImplementsInterface i = new MyClassThatImplementsInterface();
甚至
object i = new MyClassThatImplementsInterface();
简单的回答是:第一种情况和第二种情况可以调用IMyInterface定义的所有方法和属性,而不能调用最后一种情况。
但是为什么不使用第二种情况呢?嗯,这就是人们使用接口的主要原因。有时您不知道实现类。或者它是在某个库内部定义的。然而,您需要知道的是,当您调用一个方法时,您会得到一些符合您所知道的接口的对象作为回报。这就是你所需要的(有时这也是你得到的全部)。
例如:
我最近创建了一个应用程序,它可以显示插件 DLL 中定义的模块,这些模块由启动器应用程序动态加载。启动器应用程序为每个插件添加按钮,并在按下插件按钮时更改 UI。
启动器应用程序对插件一无所知 - 除了一个包含返回标题、图标、UI 的UserControl 等属性的界面。
我没有有任何我可以使用的课程。只有一个工厂类,它返回一个实现我的接口的对象的实例。这就是你所需要的。
【讨论】:
object x =...?好吧,C# 只“知道”您正在使用的变量类型的方法和属性。由于这里的变量是object 类型,因此只有该类的成员可用。要访问接口或“真实”类型的成员,您需要显式转换。
假设我们有一个接口 IRenderPage,现在页面的渲染可能因设备而异,您可以有一个指向不同实现的通用引用。
这就是为什么我们有接口,一个通过实现类来实现的契约,实现这个接口的类可以通过自己的实现参与定义的流程集。
【讨论】: