Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
作为属性的C#接口是如何工作的?_C#_Oop_Properties_Interface - Fatal编程技术网

作为属性的C#接口是如何工作的?

作为属性的C#接口是如何工作的?,c#,oop,properties,interface,C#,Oop,Properties,Interface,为了了解如何在.NET客户端应用程序/dll中实现SignalR,我正在查看中的示例。我遇到了一些我不理解的事情 private IHubProxy HubProxy { get; set; } 当查看IHubProxy时,我可以看到它是一个接口。我一直理解,你不能创建接口的实例,但如果你实现了一个新类,告诉这个新类它必须实现什么样的方法,那么它就是一个新类的契约 作为属性的接口是如何设置的?没错,您不能创建接口的实例 该代码的意思是HubProxy属性属于IHubProxy接口中的类型。例

为了了解如何在.NET客户端应用程序/dll中实现SignalR,我正在查看中的示例。我遇到了一些我不理解的事情

private IHubProxy HubProxy { get; set; } 
当查看
IHubProxy
时,我可以看到它是一个接口。我一直理解,你不能创建接口的实例,但如果你实现了一个新类,告诉这个新类它必须实现什么样的方法,那么它就是一个新类的契约


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

没错,您不能创建接口的实例


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

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

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

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
基本上您可以将实现该接口的任何内容都附加到该属性上


希望现在已经清楚:)

这意味着任何实现IHubProxy的东西都可以设置为该属性,但它将是某个东西的具体实例。但您所关心的是,它使用IHubProxy合约作为该属性的消费者,而您不关心实现细节。感谢您的快速回答!只是为了确保我明白这一点。属性HubProxy可以包含类定义中包含IHubProxy接口的类的对象/实例。通过这一点,我知道当我使用属性中的对象时,它确实理解特定的消息?是的,除非它为null,否则它绝对会提供一些具体的行为。明白了。但这与将属性定义为特定类有何不同?假设有这样一个类:
public class HubProxy:IHubProxy
使用这个类而不是像这样的接口会有什么效果:
public HubProxy HubProxy{get;set;}
,因为IHubProxy可以是任何实现,而HubProxy是一个特定的实现。我建议大家阅读一下依赖注入。一般的想法是,除非必要,否则不要使用特定的实现细节。但我想知道如何使用接口作为属性,而不是使用类定义的接口。@SoftAllan现在就来看看:)很好的例子。谢谢:)