@mletov

Какой паттерн лучше использовать при необходимости реализации методов из разных классов?

Пожалуйста, подскажите:

Есть интерфейс/абстрактный класс A
В нем 2 метода без реализации M1 и M2

Есть класс B, отнаследованный от A
Есть класс C, отнаследованный от A

В обоих своя реализация методов M1 и M2

Предположим, мне надо создать класс D, в котором M1 содержит реализацию класса B, а метод M2 реализацию класса C.

Множественного наследования в C# нет. Есть какое-нибудь общепринятое решение или готовый паттерн для таких ситуаций?
  • Вопрос задан
  • 272 просмотра
Решения вопроса 2
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
есть отличный инструмент - расширения .. творите любую вакханалию...

ps кстати, расширения отучают от привычки плодить лишние классы из за 1-2-3 методов.. ;))
Ответ написан
Комментировать
lexxpavlov
@lexxpavlov
Программист, преподаватель
Композиция, а не наследование.
D реализует IM1 и IM2, но не наследуется от классов A, B, C.
class D : IM1, IM2
{
    B _b;
    C _c;
    public D(B b, C c)
    {
        _b = b;
        _c = c;
    }

    public void M1()
    {
        _b.M1();
    }

    public void M2()
    {
        _c.M2();
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
qonand
@qonand
Software Engineer
Предположим, мне надо создать класс D, в котором M1 содержит реализацию класса A, а метод M2 реализацию класса B.

Подобные проблемы возникают как правило из-за неверно спроектированных классов, в частности когда классы "берут на себя слишком много". Вам стоит описать хотя бы в общих словах что у Вас за классы и методы
Ответ написан
@red-barbarian
не зная как так получилось)
Возможно из-за перегруженного интерфейса. ( очень важно придерживаться тонких интерфейсов. например интерфейс M1 интерфейс M2)
Но разрешить (возможно) так
D реализует интерфейс, но делегирует выполнение M1 классу B, M2 классу C
т.е. шаблон делегирование
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы