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