Чтобы визуализировать мою проблему, вот небольшая картинка:

У нас тут две сборки. Оба они запутаны. База написана и запутана нами. Особый написан и запутан другим человеком А. У А нет наших исходников, а у нас нет его. Вся идея в том, что A хочет иметь возможность расширять каждую функцию в нашем BaseAssembly. A знает, что у нас есть реализации для всех общедоступных видимых интерфейсов в BaseInterfaceAssembly. Он хочет расширить наш BaseClass, добавив methodB() и сделав что-то в methodA() до того, как будет вызвана базовая реализация. BaseClass является внутренним и запутанным.
Это тот момент, когда декоратор вступает в игру. Мы могли бы заставить A сделать декоратор для объекта BaseInterface. Для этого нам нужно создать абстрактную базу декораторов, в которой A нужно только переопределить methodA() и добавить methodB(). Для него не было бы никакой разницы. Для нас мы должны писать и поддерживать эти абстрактные декораторы для каждого интерфейса. Это накладные расходы, которые нам не нужны.
Первый вопрос, есть ли альтернатива, где обе стороны не имеют накладных расходов - я бы также принял какой-то хак, если он не вызывает проблем с производительностью после создания объекта?
Второй вопрос, если нет альтернативы, то есть ли способ написать один абстрактный декоратор всех интерфейсов, которые есть и которые будут в будущем?
ИЗМЕНИТЬ
По запросу пример кода:
public interface BaseInterface
{
void MethodA();
}
internal class BaseClass : BaseInterface
{
public virtual void MethodA()
{
//do something
}
}
internal class SpecialClass : BaseClass
{
public override void MethodA()
{
//do something before
base.MethodA();
}
public void MethodB()
{
//do something
}
}
С уважением, Иггдрасиль.
MethodB(), но я не работаю для манипулированияMethodA(), как показано в примере кода. - person Yggdrasil   schedule 24.10.2013