Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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# 接口的隐式和显式实现_C#_.net_Interface - Fatal编程技术网

C# 接口的隐式和显式实现

C# 接口的隐式和显式实现,c#,.net,interface,C#,.net,Interface,在进行升级时,我碰巧遇到了这样的代码 interface ICustomization { IMMColumnsDefinition GetColumnsDefinition(); } class Customization : ICustomization { private readonly ColumnDefinition _columnDefinition; //More code here.

在进行升级时,我碰巧遇到了这样的代码

interface ICustomization
    {
        IMMColumnsDefinition GetColumnsDefinition();
    }

    class Customization : ICustomization
    {
        private readonly ColumnDefinition _columnDefinition;

        //More code here.

        public ColumnsDefinition GetColumnsDefinition()
        {
            return _columnDefinition;
        }

        ColumnsDefinition ICustomization.GetColumnsDefinition()  //redundant
        {
            return GetColumnsDefinition();            
        }
    }
我的问题是: 在这段代码中是否需要/使用接口的“显式”实现? 如果我删除上面标记为“冗余”的方法(接口的显式实现),它会产生任何问题吗

PS:我知道接口的显式实现非常重要,当我们只需要在接口级别访问一个方法,并且使用两个具有相同方法签名的接口时,可以使用它。

是的。看起来多余

通过自定义类型的引用和ICCustomization类型的引用调用它会导致相同的行为。如果您希望下面的调用有不同的行为,那么显式实现接口是有意义的

Customization oVar = new Customization();
oVar.GetColumnsDefinition(); // calls 1st method
ICustomization iVar = obj;
iVar.GetColumnsDefinition(); // calls 2nd method - explicit impl.

您应该删除显式实现。但是,如果删除其他实现,则会约束客户端,使其无法再调用oVar.getColumnsDefinition()-它们必须使用如上所示的接口变量。

有关信息,您看到特定模式的主要时间是(以下任意一种):

  • 非显式方法是
    virtual
    abstract
    ,用于覆盖
    的子类
  • public
    方法的签名并不完全相同,例如,public API有一个更具体的返回类型(常见于
    IEnumerable[]
    ICloneable
  • 我们不希望它是公共的,但我们希望它可以在类型中轻松调用(不需要nop cast)

在这种情况下,它看起来确实是多余的。

为什么有一个虚拟的非显式实现也是有显式实现的原因?如果您同时实现了这两个,然后创建了一个子类,那么如果您对引用子类对象的接口变量调用该方法,会发生什么?你能举个例子吗?另见。