Я наткнулся на эту "функцию" 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
.
Какова причина позади этого волшебства?
По моему скромному мнению: эта функция "квазиреализации" очень неинтуитивна, и сделайте инспекцию кода намного тяжелее. Что Вы думаете?
Причина в том, что ваш комментарий просто неверен:
// Обратите внимание, что Derived не предоставляет реализацию для IContract
Конечно, предоставляет. Следуйте логике до конца.
эта функция очень неинтуитивна и значительно усложняет проверку кода. Как вы думаете?
Я думаю, вам не следует использовать эту функцию, если она вам не нравится. Если вас сбивает с толку и странно читать код, использующий эту функцию, посоветуйте своим коллегам, использующим эту функцию, прекратить это делать.
Чем эта функция отличается от любой другой функции, в которой метод базового класса используется из производного класса? Существует несколько различных способов использования или упоминания метода из базового класса в производном классе - вызовы методов, переопределения, преобразования групп методов и т. Д.
Кроме того, это относительно простой случай. Если вы действительно хотите пожаловаться на запутанную семантику интерфейса в C #, я бы потратил свое время на жалобы на семантику повторной реализации интерфейса . Кажется, что именно из него люди запекают лапшу. Мне всегда приходится искать это в спецификации, чтобы убедиться, что я правильно понимаю семантику.
Почему вы считаете, что это странно и неестественно? Каждый публичный член базового класса также является публичным членом производного класса. Так что здесь нет никакого противоречия. В любом случае, вы можете реализовать интерфейс явно, если хотите.