Есть ли удобный способ отобразить все методы интерфейса на подобъект? - PullRequest
1 голос
/ 28 июня 2011

Предположим, мне нужно наследовать от двух классов в C # .Это недопустимо, поэтому я могу делать следующее: наследовать от одного из классов и включать другой класс в качестве переменной-члена, наследовать от его интерфейсов и переопределять все методы этих интерфейсов, перенаправляя их на эту переменную-член:

interface SecondBaseInterface {
    void FirstMethod();
    void SecondMethod();
};

class MyClass : FirstBaseClass, SecondBaseInterface {

   public void FirstMethod()
   {
      secondBase.FirstMethod();
   }

   public void SecondMethod()
   {
      secondBase.SecondMethod();
   }

   SecondBaseClass secondBase = new SecondBaseClass();
};

теперь это работает, но если в SecondBaseInterface много методов, то потребуется много типизации кода, который на самом деле ничего не дает, и мне придется поддерживать этот код в случае изменения SecondBaseInterface.

Есть ли какая-либо особенность C #, которая сообщала бы компилятору "обо всех методах SecondBaseInterface, пожалуйста, вызовите соответствующие методы этой переменной-члена" или какой-либо другой удобный способ сделать такое массовое перенаправление?

Ответы [ 4 ]

1 голос
/ 28 июня 2011

Я знаю боль.

Так много, что я начал собственный проект, чтобы решить эту проблему: NRoles .

Это приносит форму trait (pdf) в C #.

Ваш код будет выглядеть следующим образом:

class FirstRole : Role {
  public void FirstMethod() { ... }
  public void SecondMethod() { ... }
}

class SecondRole : Role {
  ...
}

class MyClass : Does<FirstRole>, Does<SecondRole> {

}

Вы также можете реализовать интерфейсы через роли, и они будут перенесены всоставление класса.

1 голос
/ 28 июня 2011

Нет простой языковой функции, которая приходит на ум, вот несколько идей:

  1. Используйте .NET4.0 DynamicObject , где вы можете добавлять свойства / элементы на лету.
  2. Используйте Аспектно-ориентированное приограммирование или IL Weaving, чтобы добавить миксин. См. Например, PostSharp .
  3. Используйте некоторую форму генерации кода, например, ReSharper .
1 голос
/ 28 июня 2011

Я думаю, что почти каждый опытный разработчик C #, возможно, пожелал этого на каком-то этапе - особенно те, кто раньше был разработчиком Delphi. Он называется «реализация делегированием» и был доступен в Delphi.

Фактически, человек, ответственный за эту функцию Delphi, Стив Тейшейра, теперь работает в MSFT. Вот запись в блоге , где он говорит об этом.

К сожалению, C # не может этого сделать, поскольку CLI не поддерживает реализацию путем делегирования.

1 голос
/ 28 июня 2011

Мне бы тоже хотелось иметь такую ​​возможность, но я не думаю, что она существует. Однако не бойтесь делать это, если вам действительно нужен класс, который может выступать в роли обоих его суперклассов: это хорошо известный шаблон делегирования (как вы, вероятно, знаете).

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