Я хочу смоделировать вывод из базового класса (который недоступен), используя только интерфейс и экземпляр базового класса (в отличие от просто производного непосредственно от базового класса).
Позвольте мне попытаться объяснить лучше: у меня есть открытый интерфейс и (скрытая) реализация класса для него.
В другом модуле я создаю 2-ю реализацию интерфейса и передаю ему экземпляр скрытого класса из первого модуля.
Что я хочу сделать для 2-й реализации:
- делегирует методы интерфейса реализации по умолчанию
- может переопределить любой метод интерфейса
- может быть получено из
- [сложная часть] код из реализации по умолчанию, которая вызывает виртуальные методы, будет вызывать переопределенные методы этого класса или производные от него классы.
Помните, я не могу напрямую получить реализацию по умолчанию!
Лучший способ описать это - пример.
Сборка A:
internal class DefaultImpl: IMyInterface {
public virtual void MyMethod(){
//call a virtual method vvvv
Console.WriteLine(this.GetString());
}
public virtual string GetString(){
return "default implementation";
}
}
public Interface IMyInterface {
void MyMethod();
string GetString();
}
------
Сборка B:
class BaseExtraImpl: IMyInterface {
public BaseExtraImpl(IMyInterface i_implementation){
/* magic happens here */
}
public virtual void MyMethod(){ /*delegate to implementation*/ }
public virtual string GetString(){ /*delegate to implementation*/ }
}
class ExtraImpl: BaseExtraImpl{
public ExtraImpl(IMyInterface i_implementation): base(implementation) {}
public override string GetString(){
return "extra implementation";
}
}
Использование:
DefaultImpl def;
// ^^^ this is initialized to an instance of DefaultImpl;
// it doesn't matter how.
ExtraImpl extra = new ExtraImpl(def);
extra.MyMethod(); //should print "extra implementation"