如何在此上下文中调用接口方法?

时间:2013-08-01 11:12:11

标签: c# visual-studio-2010 .net-4.0 interface .net-4.5

这对我来说很惊讶!当我看到某人的代码时,我只注意到这一行(缩短版本!)

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 个答案:

答案 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();