【问题标题】:Interfaces containing references to data包含对数据的引用的接口
【发布时间】:2016-03-14 17:39:27
【问题描述】:

我刚刚了解到,在 C# 中,您可以在技术上将数据存储在接口中。请参阅以下示例。使用此示例接口和类:

public interface IInterface
{
    int id { get; set; }
}

public class ExampleClass : IInterface
{
    public int id { get; set; }
}

还有示例程序。

class Program
{
    static void Main(string[] args)
    {
        var newExample = new exampleClass();
        newExample.id = 5;

        IInterface exInterface = newExample;

        Console.WriteLine(exInterface.id);

        Console.ReadLine();
    }
}

我会得到 5 的输出。为什么?我认为接口除了结构之外没有存储任何东西。这种间接存储和引用是否有技术术语?因为这个功能有点隐藏,这不是也有点糟糕吗?我通常不会想到引用接口上的属性来检索实际数据,这就是对象的用途。

如果格式错误或我需要清除任何内容,请告诉我。谢谢!

【问题讨论】:

  • 这个值是在类中存储的,但是你可以通过接口访问它,如果你有两个类实现你的接口,这将是有用的
  • 您的两个变量都引用了相同的内存。为什么你会期望同一个内存包含两个不同的值?赋值不会复制任何内容,您只需将两个引用设置为同一个对象实例。
  • 基本上你所做的只是将ExampleClass 转换为它的界面。您检索的值仍然来自object newExample。该接口提供了一个必须由类提供的契约,因此我们知道如果我们有一个IInterface,它必须提供一个属性id,它返回一个int。没有隐藏的功能,你只是调用object实现的类接口。

标签: c# .net interface


【解决方案1】:

接口不存储任何数据。将接口想象成(松散地)描述一个契约,上面写着“任何实现我的类都必须提供以下属性/方法”。

这段代码

    var newExample = new ExampleClass();
    newExample.id = 5;

正在这样做:

创建ExampleClass 的新实例并将值 5 分配给 id 属性。

但是,这段代码

    IInterface exInterface = newExample;

是这样说的:

newExample 的实例转换(更改)为接口IInterface 的实例。

这意味着任何时候您访问exInterface 变量,您只能访问该接口中定义的那些属性/方法(即使您的类可能定义了其他属性/方法)。

您永远不能创建接口的实例。它总是在创建实现该接口的类的实例的上下文中。如果然后将该实例强制转换为接口,则本质上是在使用“最小公分母”类型的方法,并限制对该接口定义的访问。

【讨论】:

  • 啊,“最小公分母”类型的方法想法让我很满意。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 2018-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多