接受两个接口中函数的名称冲突

时间:2019-01-11 07:05:14

标签: oop interface language-agnostic multiple-inheritance name-collision

这与语言无关,因为我的问题适用于任何具有interface概念的语言。 (或快速协议)

在C#中考虑此程序:

interface Inter1
{
    int Count();
}

interface Inter2
{
    int Count();

}

public class SomeClass : Inter1, Inter2
{
    public int Count()  // which one is it ?
    {
        return 0;
    }    
}

static void Main(string[] args)
{
    Inter1 c = new SomeClass();
    int i = c.Count();
}

或在C ++中: https://godbolt.org/z/dFLpji

我很难理解为什么可以容忍,尽管看起来所有可能的符号引用都是明确的,因为静态类型将指定我们正在谈论的功能。

但这不是很危险地接近姓名隐藏吗?

我正在考虑的问题的说明:

// in FileA.cs on day 0
interface DatabaseCleaner
{
    void Execute();
}

// in FileFarAway.cs day 140
interface FragmentationLogger
{
    void Execute();  // unfortunate naming collision not noticed
}

// in PostGreAgent.cs day 141
public class PostGreAgent : DatabaseCleaner, FragmentationLogger
{
    public void Execute()
    {   // I forgot about the method for database cleanup, or dismissed it mentally for later. first let's test this
        allocator.DumpFragmentationInfo();
    }

    private Allocator allocator;
}

// client.cs
AgentsManager agents;
void Main(string[] args)
{
    var pa = new PostGreAgent();
    agents.Add(pa);
    // ... later in a different location
    DatabaseCleaner cleaner = agents.FindBest();
    cleaner.Execute();  // uh oh
}

1 个答案:

答案 0 :(得分:0)

这里没有歧义。

接口/协议只是一系列要求,要求实现/遵循该对象的对象必须能够执行的操作。 if (notification.additionalData.foreground) { // code as your functionality } else { console.log("else", notification); this.handleNofication(notification.additionalData); } handleNofication(data) { // here you can also pass data this.app.getRootNav().setRoot("RosterPage", { direction: "forward" }); } Inter1都说,实现它的人必须能够Inter2。因此,如果可以Count(),则可以实现两个接口。就这么简单。这里没有歧义,因为Count()一个实现。 CountInter1.Count是同一件事。

请注意,在C#中,您可以显式实现接口,本质上为Inter2.CountCount提供了Inter1的不同实现。行为是非显式实现将隐藏显式实现,因此您只能使用接口的编译时类型访问显式实现。