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
C# 设置带有接口的类,2个选项_C#_Optimization - Fatal编程技术网

C# 设置带有接口的类,2个选项

C# 设置带有接口的类,2个选项,c#,optimization,C#,Optimization,我正在看一个例子,我不知道他们为什么这样做。 他们正在将mySender设置为与IEmailSender IEmailSender mySender = new MyEmailSender(); 为什么不直接写呢 MyEmailSender mySender = new MyEmailSender(); 因为MyEmailSender已经在稍后编写的代码中有了IEmailSender接口引用 mySender = new MyNewEmailSender(); 如果必要的话。但这并不一定是

我正在看一个例子,我不知道他们为什么这样做。 他们正在将mySender设置为与IEmailSender

IEmailSender mySender = new MyEmailSender();
为什么不直接写呢

MyEmailSender mySender = new MyEmailSender();

因为MyEmailSender已经在稍后编写的代码中有了IEmailSender接口引用

mySender = new MyNewEmailSender();

如果必要的话。但这并不一定是对的或错的。他们只是想说明一点,
mySender
是一个
iemailssender
,不管实现如何。

在后面的代码中,他们可以编写

mySender = new MyNewEmailSender();

如果必要的话。但这并不一定是对的或错的。他们只是想说明一点,
mySender
是一个
iemailssender
,不管它的实现是什么。

有很多原因,其中一个原因是如果你针对
iemailssender
接口编程,然后决定你要
myevenberteremailssender
,你只需要更改一行代码

另一个是,它允许您将代码与特定实现“解耦”,甚至可以将其注入程序,而不是在程序中硬编码


请阅读维基百科上的更多内容。

原因很多,其中一个原因是如果您针对
iemailssender
界面编程,然后决定使用
myevenberteremailssender
,那么您只需更改一行代码

另一个是,它允许您将代码与特定实现“解耦”,甚至可以将其注入程序,而不是在程序中硬编码


阅读Wikipedia上的更多信息。

如果以后的代码不依赖于它是
MyEmailSender
,它的目的只是与接口
IEmailSender
及其成员交互,那么它就与实现分离了。它不关心实现,也不会意外地根据它编写代码。编程到接口可以让人更容易地更改实现(未来的更改、测试等。如果以后的代码不依赖于它是
MyEmailSender
,它的目的只是与接口
IEmailSender
及其成员交互,那么它与实现分离。它不关心实现,也不会意外地根据它编写代码.对接口进行编程可以更轻松地更改实现(未来的更改、测试等。事实上,如果两个实现确实具有相同的接口,那么在任何一种情况下,您只需要更改这一行代码,您只需更改这一行上的两个单词,而不是一个。是的,可能不是最好的参数,但这是第一个想到的参数(以及为什么我添加了对基于接口编程的引用)好吧,这是错误的,这并不是说它不重要。即使使用具体类型,也只需要更改一行代码以使用不同的代码。接口是非常有用和强大的工具,但当一个变量始终是一个具体类型时,“你”是创建具体类型的人,使用接口几乎没有什么好处(如果有的话)。在合适的时候使用它们,在不合适的时候不要使用它们。@Servy您还假设
IEmailSender
MyEmailSender
实现的唯一接口。如果它实现了其他接口(或者有其他纯类方法)以后使用,那么仅仅更改实现是不起作用的如果您使用的方法不在该接口中,那么您将需要使用具体类型,并且仅使用该接口不是一个选项。事实上,如果两个实现确实具有相同的接口,那么在任何一种情况下,您都只需要更改这一行代码,您只需在该行上更改两个单词,而不是o是的,可能不是最好的论点,但这是我想到的第一个论点(以及为什么我添加了对基于接口编程的引用)好吧,这是错误的,这并不是说它不重要。即使使用具体类型,也只需要更改一行代码以使用不同的代码。接口是非常有用和强大的工具,但是当变量始终是单一的具体类型,并且“您”是创建该具体类型的人时,很少(如果有的话)使用接口的优点。在合适的时候使用它们,在不合适的时候不要使用它们。@Servy还假设
iemailssender
MyEmailSender
实现的唯一接口。如果它实现了其他接口(或有其他纯类方法)这是以后使用的,那么仅仅更改实现是不起作用的。(假设新实现也没有这些方法)如果您使用的方法不在该接口中,那么您将需要使用具体类型,并且仅使用该接口将不是一个选项。非常好,我理解。我只是看不到我自己添加MyNewEmailSender,调整MyEmailSender中需要更改的一个方法可能会更容易…我确信有许多cases,只是想不出我头顶的例子很好,我理解。我只是看不到我自己加入MyNewEmailSender,调整MyEmailSender中需要更改的一种方法可能会更容易…我确信有很多情况,只是想不出头顶的例子