допускается столкновение имени функции в двух интерфейсах - PullRequest
0 голосов
/ 11 января 2019

Это не зависит от языка в том смысле, что мой вопрос применим к любому языку, который имеет концепцию 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 голосов
/ 11 января 2019

Здесь нет двусмысленности.

Интерфейсы / протоколы - это просто список требований, говорящих о том, что должен уметь делать объект, реализующий / соответствующий ему. Inter1 и Inter2 оба говорят, что тот, кто его реализует, должен иметь возможность Count(). Так что если вы можете Count(), вы можете реализовать оба интерфейса. Это так просто. Здесь нет никакой двусмысленности, потому что есть только одна реализация Count. Inter1.Count и Inter2.Count - это одно и то же.

Обратите внимание, что в C # вы можете явно реализовывать интерфейсы, по существу предоставляя другую реализацию Count для Inter1 и Inter2. Поведение заключается в том, что неявные реализации скрывают явные реализации, поэтому вы можете получить доступ только к явным реализациям с типом интерфейса во время компиляции.

...