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 API有一个更具体的返回类型(常见于public
或IEnumerable[]
)ICloneable
- 我们不希望它是公共的,但我们希望它可以在类型中轻松调用(不需要nop cast)
在这种情况下,它看起来确实是多余的。为什么有一个虚拟的非显式实现也是有显式实现的原因?如果您同时实现了这两个,然后创建了一个子类,那么如果您对引用子类对象的接口变量调用该方法,会发生什么?你能举个例子吗?另见。