2

这对我来说是一个惊喜!当我看到某人的代码时,我只是注意到了这一行(缩短版!)

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() ?

为什么编译器允许另一个具有相同名称的方法?

4

4 回答 4

3

IPrint.PrintDateTimeNow()是所谓的显式接口定义,相对于隐式接口定义您将在C# Interfaces 中找到对您问题的详细解答。隐式实现与显式实现

// 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原则。

于 2013-08-01T11:14:53.520 回答
1

它被称为显式接口实现......请阅读有关该特定主题的MSDN !

实现接口的类可以显式地实现该接口的成员。当显式实现成员时,不能通过类实例访问它,而只能通过接口的实例访问。

于 2013-08-01T11:14:49.347 回答
1

IPrint.PrintDateTimeNow()是一个显式的接口实现。您需要转换objIPrint才能调用IPrint.PrintDateTimeNow()

((IPrint)obj).PrintDateTimeNow();

如果您的类实现声明相同成员(或具有相同名称的成员)的多个接口,这将很有帮助

于 2013-08-01T11:16:06.420 回答
1

只有当您像这样访问时才会调用显式实现obj

IPrint obj = new DatePrint();
obj.PrintDateTimeNow();
于 2013-08-01T11:16:33.777 回答