【问题标题】:How does a C# Interface as a property work?作为属性的 C# 接口如何工作?
【发布时间】:2017-04-03 08:41:38
【问题描述】:

我正在查看来自 Using SignalR in WinForms and WPF 的示例,以便了解如何在 .NET 客户端应用程序/dll 中实现 SignalR。我遇到了一些我不明白的概念。

private IHubProxy HubProxy { get; set; } 

当查看IHubProxy 时,我可以看到它是一个接口。我一直都明白,你不能创建一个接口的实例,但如果你实现它告诉新类它必须实现什么方法,它更像是一个新类的契约。

作为属性的接口设置如何工作?

【问题讨论】:

  • 这意味着任何实现 IHubProxy 的东西都可以设置为该属性,但它将是某物的具体实例。但您只关心它使用 IHubProxy 合约作为该属性的消费者,您并不关心实现细节。
  • 感谢您的快速回答!只是为了确保我理解这一点。属性 HubProxy 可以保存具有 IHubProxy 接口作为类定义一部分的类的对象/实例。由此我知道,当我从属性中处理对象时,它确实理解特定的消息?
  • 是的,除非它为空,否则它绝对会提供一些具体的行为。
  • 好的,知道了。但这与将属性定义为特定类有何不同?假设有一个像这样的类:public class HubProxy : IHubProxy 使用这个类而不是像这样的接口会有什么效果:public HubProxy hubProxy { get; set; }
  • 因为 IHubProxy 可以是任何实现,而 HubProxy 是一种特定的实现。我建议阅读依赖注入。一般的想法是不使用特定的实现细节,除非有必要

标签: c# oop properties interface


【解决方案1】:

当然,您不能为接口创建实例,但可以创建实现该接口的类的实例。

让我举个例子,考虑下面的代码:

interface IEmailSender
{
   void SendEmail();
}

public class EmailSender : IEmailSender 
{
   public void SendEmail()
   {
      throw new NotImplementedException();
   }

   public void DoOtherStuff()
   {
      throw new NotImplementedException();
   }
}

现在下面的代码是完全合法的:

IEmailSender mailSender = new EmailSender(); 
mailSender.SendEmail(); //Works just fine
mailSender.DoOtherStuff(); //Will raise an error at compile time

在属性中的使用

让我们构建一个测试类:

public class Test 
{
    public IEmailSender MyEmailSender;
}

现在让我们检查以下代码:

var testOBJ = new Test();
testOBJ.MyEmailSender = new IEmailSender(); //Raises a compile time error, as you outlined yourself
testOBJ.MyEmailSender = new EmailSender(); //Perfectly Legal

基本上您可以为该属性分配任何实现该接口的东西

希望现在很清楚:)

【讨论】:

  • 知道了。但我想知道使用接口作为属性而不是使用类定义的接口。
  • @SoftAllan 立即查看 :)
  • 优秀的例子。谢谢:)
【解决方案2】:

你是对的,你不能创建一个接口的实例。

该代码的意思是 HubProxy 属性是继承 IHubProxy 接口的类型。例如,get 返回一个实现 IHubProxy 接口的类的实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 2017-03-27
    • 2014-02-22
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    相关资源
    最近更新 更多