这对我来说很惊讶!当我看到某人的代码时,我只注意到这一行(缩短版本!)
interface IPrint
{
void PrintDateTimeNow();
}
class DatePrint : IPrint
{
void IPrint.PrintDateTimeNow()
{
throw new NotImplementedException();
}
public PrintDateTimeNow()
{
throw new NotImplementedException();
}
}
我试图调用此方法并调用函数“PrintDateTimeNow()”。
var obj = new DatePrint();
obj.PrintDateTimeNow();
那意味着,IPrint.PrintDateTimeNow()方法的目的是什么?
如何调用IPrint.PrintDateTimeNow()?
为什么编译器允许另一个具有相同名称的方法?
答案 0 :(得分:3)
IPrint.PrintDateTimeNow()
是所谓的显式接口定义,而不是隐式接口定义。您可以在C# Interfaces. Implicit implementation versus Explicit implementation
// This will call the implicit implementation
var obj = new DatePrint(); // same as DatePrint obj = new DatePrint();
obj.PrintDateTimeNow();
// This will call the explicit implementation
IPrint obj = new DatePrint();
obj.PrintDateTimeNow();
如果出于某种原因,您希望这两种情况的行为不同,则需要显式和隐式定义。如果它们的行为相同,那么显式定义是多余的,可能会被转储。
就我个人而言,我永远不会过早地添加它们,以防将来某些时候你需要它。我认为这违反了YAGNI原则。
答案 1 :(得分:1)
它被称为显式接口实现...请阅读该特定主题的MSDN!
实现接口的类可以显式实现成员 那个界面。当成员明确实现时,它不能 可以通过类实例访问,但只能通过实例访问 界面。
答案 2 :(得分:1)
IPrint.PrintDateTimeNow()
是explicit interface implementation。您需要将obj
投射到IPrint
才能拨打IPrint.PrintDateTimeNow()
:
((IPrint)obj).PrintDateTimeNow();
如果您的类实现了声明相同成员(或具有相同名称的成员)的mutliple接口,这将非常有用
答案 3 :(得分:1)
只有在您访问obj
时才会调用显式实现:
IPrint obj = new DatePrint();
obj.PrintDateTimeNow();