【问题标题】:What is the practical use of using interface reference variable in C#?在 C# 中使用接口引用变量的实际用途是什么?
【发布时间】:2016-06-03 19:00:34
【问题描述】:

我知道接口引用变量可以引用任何实现其接口的对象。但是使用参考变量的实际用途是什么?我们可以通过使用对象来达到同样的效果,那为什么要使用引用变量呢?

【问题讨论】:

标签: c# interface


【解决方案1】:

这个问题有很多解释的余地​​,但这是我的问题:

每个对象变量在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 类型,因此只有该类的成员可用。要访问接口或“真实”类型的成员,您需要显式转换。
【解决方案2】:

假设我们有一个接口 IRenderPage,现在页面的渲染可能因设备而异,您可以有一个指向不同实现的通用引用。

这就是为什么我们有接口,一个通过实现类来实现的契约,实现这个接口的类可以通过自己的实现参与定义的流程集。

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 2010-09-20
    • 2011-05-25
    • 1970-01-01
    • 2011-04-02
    • 2019-05-17
    • 2015-04-22
    • 2021-07-22
    • 1970-01-01
    相关资源
    最近更新 更多