Я уже некоторое время ограниченно использую необязательные параметры в .NET 4. Недавно я подумал о том, как реализованы необязательные параметры, и меня осенило.
Возьмем следующий пример:
public interface ITest
{
void Go(string val = "Interface");
}
Единственное требование для реализации этого состоит в том, чтобы была реализована самая большая форма подписи void Go (string val)
, на самом деле нам не нужно реализовывать необязательный параметр, поскольку компилятор позаботится об этом подключении (хотя возможность использования необязательных параметров будет недоступна, когда используя конкретный класс напрямую).
С учетом сказанного, чтобы обеспечить функциональность в обоих местах и чтобы ее можно было обнаружить в реализации, можно реализовать необязательное объявление как в интерфейсе, так и в реализации. Фактически, инструмент повышения производительности ReSharper автоматически подтянет это необязательное объявление к конкретному типу при реализации интерфейса. Это кажется логичным поступком. Тем не мение...
Что мешает нам использовать разные значения в конкретном типе и интерфейсе? Это вызвало у меня тревогу сегодня утром, как будто кто-то войдет, чтобы изменить это значение, и забудет сохранить его в наследовании переопределений/интерфейсов, поведение будет совершенно другим в зависимости от того, как вы получаете доступ к объекту. Это может быть очень неприятно для отладки.
Попробуйте этот скрипт LINQpad:
void Main()
{
IA iface = new A();
A cls = new A();
iface.Go();
cls.Go();
}
interface IA
{
void Go(string val = "Interface");
}
class A : IA
{
public void Go(string val = "Class") { val.Dump(); }
}
Вывод будет:
Interface
Class
Что подводит меня к моему актуальному вопросу:
Вопрос:
Каким (если есть?) способом мы можем защитить это, не теряя возможности использовать необязательный вариант параметра из конкретного класса, чтобы он был доступен для обнаружения/чтения кодировщику?
Кто-нибудь сталкивался с этой проблемой раньше? Как вы это решили? Существуют ли какие-либо передовые методы, которые могут помочь предотвратить распространение этой проблемы в крупномасштабной кодовой базе с несколькими разработчиками?