C #: Имитация наследования с использованием только интерфейса и экземпляра его реализации - возможно ли это? - PullRequest
1 голос
/ 27 января 2010

Я хочу смоделировать вывод из базового класса (который недоступен), используя только интерфейс и экземпляр базового класса (в отличие от просто производного непосредственно от базового класса).

Позвольте мне попытаться объяснить лучше: у меня есть открытый интерфейс и (скрытая) реализация класса для него.

В другом модуле я создаю 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"

Ответы [ 3 ]

2 голосов
/ 27 января 2010

Что вам нужно, так это возможности mixin в c #. К сожалению, в C # таких нет. Может быть, вы найдете ответ здесь: Возможно ли реализовать миксины в C #?

0 голосов
/ 27 января 2010

Вы могли видеть этот предыдущий пост Как получить доступ к внутреннему классу из внешней сборки .

Однако суть в том, что вы можете применить атрибут сборки InternalsVisibleTo к сборке A, чтобы сборка B могла просматривать и получать доступ к реализации по умолчанию, но это работает, только если у вас есть контроль над исходным кодом обеих сборок. В противном случае вам нужно использовать отражение для создания экземпляра Default по умолчанию в сборке B, а затем в ваших методах вызывать методы для отраженного объекта.

0 голосов
/ 27 января 2010

Хм, это всегда будет выводить "default implementation". Единственный вариант, который я вижу, - это реализовать собственную версию IMyInterface, возможно, скопировав код из DefaultImpl (если вам позволено), но я думаю, что это действительно то, чего вы избегаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...