Объедините функции двух разных базовых классов - PullRequest
2 голосов
/ 14 февраля 2010

Я пытаюсь объединить функции двух разных базовых классов в новый класс, но безрезультатно. Скажем, у меня есть классы A и B, тогда как B является потомком A с другой функциональностью (то есть не может использоваться вместо A во время выполнения) и мне нужен класс C, который объединяет A и B, использует оба и обеспечивает уникальный интерфейс для пользователей C. Как мне этого добиться? Многократное наследование невозможно с C #, интерфейсы, кажется, не подходят. Так что я могу сделать?

Ответы [ 5 ]

14 голосов
/ 14 февраля 2010

Ваш дизайн сломан.

B является потомком A с другой функциональностью (т.е. не может использоваться вместо A во время выполнения)

Эта ситуация является неправильным использованием наследства. Если вы хотите сделать это, вы должны либо использовать композицию, либо общий интерфейс, который A и B используют отдельно.

1 голос
/ 14 февраля 2010

Рассмотрим явную реализацию интерфейса:

http://msdn.microsoft.com/en-us/library/ms173157.aspx

public interface IFriendly
{
  void Greet();
}

public interface IEnemy
{
  void Greet();
}

public class SomeGuy : IFriendly, IEnemy
{
  //default Greeting
  public void Greet()
  {
    //...
  }

  //greeting when using an IFriendly reference
  void IFriendly.Greet()
  {
    //,,
  }

  //greeting when using an IEnemy reference
  void IEnemy.Greet()
  {
    //,,
  }
}
0 голосов
/ 16 февраля 2010

Проблема решена. Используя System.Reflection сейчас.

0 голосов
/ 14 февраля 2010

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

Но, чтобы решить вашу непосредственную проблему, почему бы не создать экземпляр этих двух классов (игнорировать тот факт, что они находятся в отношениях наследования) и вызвать методы в нужной вам последовательности? Думайте о C как о фасаде для A и B.

0 голосов
/ 14 февраля 2010

Вы говорите, что B происходит от A, но отличается и не может использоваться как A; это полностью противоречит цели наследования. Чего ты пытаешься достичь? В любом случае, звучит так, как будто вы должны использовать композицию, а не наследование. Если C не предоставляет интерфейс, определенный A или B, то он не должен наследоваться ни от одного.

...