То, почему базовый класс в C#, позволило реализовывать интерфейсный контракт, не наследовавшись ему?

Я наткнулся на эту "функцию" C# - базовый класс, который методы интерфейса реализаций не должны получать из него.

Пример:

public interface IContract
{
    void Func();
}

// Note that Base does **not** derive from IContract
public abstract class Base
{
    public void Func()
    {
        Console.WriteLine("Base.Func");
    }
}

// Note that Derived does *not* provide implementation for IContract
public class Derived : Base, IContract
{
}

То, что происходит, является этим Derived волшебно берет открытый метод, Base.Func, и решает, что это реализует IContract.Func.

Какова причина позади этого волшебства?

По моему скромному мнению: эта функция "квазиреализации" очень неинтуитивна, и сделайте инспекцию кода намного тяжелее. Что Вы думаете?

18
задан Peter Mortensen 6 February 2013 в 20:33
поделиться

2 ответа

Причина в том, что ваш комментарий просто неверен:

// Обратите внимание, что Derived не предоставляет реализацию для IContract

Конечно, предоставляет. Следуйте логике до конца.

  • Derived требуется для предоставления публичного члена, соответствующего каждому члену IContract.
  • Все наследуемые члены базового класса также являются членами производного класса; это определение наследования.
  • Следовательно, Derived предоставляет реализацию для IContract; его унаследованный член - это член, который удовлетворяет требованию
  • Следовательно, ошибки нет.

эта функция очень неинтуитивна и значительно усложняет проверку кода. Как вы думаете?

Я думаю, вам не следует использовать эту функцию, если она вам не нравится. Если вас сбивает с толку и странно читать код, использующий эту функцию, посоветуйте своим коллегам, использующим эту функцию, прекратить это делать.

Чем эта функция отличается от любой другой функции, в которой метод базового класса используется из производного класса? Существует несколько различных способов использования или упоминания метода из базового класса в производном классе - вызовы методов, переопределения, преобразования групп методов и т. Д.

Кроме того, это относительно простой случай. Если вы действительно хотите пожаловаться на запутанную семантику интерфейса в C #, я бы потратил свое время на жалобы на семантику повторной реализации интерфейса . Кажется, что именно из него люди запекают лапшу. Мне всегда приходится искать это в спецификации, чтобы убедиться, что я правильно понимаю семантику.

32
ответ дан 30 November 2019 в 06:50
поделиться

Почему вы считаете, что это странно и неестественно? Каждый публичный член базового класса также является публичным членом производного класса. Так что здесь нет никакого противоречия. В любом случае, вы можете реализовать интерфейс явно, если хотите.

12
ответ дан 30 November 2019 в 06:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: