Исходя из фона C ++, я привык к множественному наследованию. Мне нравится ощущение дробовика, прямо нацеленного на мою ногу. В настоящее время я больше работаю в C # и Java, где вы можете наследовать только один базовый класс, но реализовать любое количество интерфейсов (правильно ли я понял терминологию?).
Например, давайте рассмотрим два класса, которые реализуют общий интерфейс, но разные (но обязательные) базовые классы:
public class TypeA : CustomButtonUserControl, IMagician
{
public void DoMagic()
{
// ...
}
}
public class TypeB : CustomTextUserControl, IMagician
{
public void DoMagic()
{
// ...
}
}
Оба класса UserControl
s, поэтому я не могу заменить базовый класс. Оба должны реализовать функцию DoMagic
. Моя проблема сейчас в том, что обе реализации функции идентичны. И я ненавижу копировать и вставлять код.
(возможные) решения:
- Я, естественно, хочу, чтобы
TypeA
и TypeB
разделяли общий базовый класс, где я могу написать одно и то же определение функции только один раз. Однако из-за ограничения только одного базового класса я не могу найти место в иерархии, где оно подходит.
- Можно также попытаться реализовать своего рода составной шаблон . Помещение функции
DoMagic
в отдельный вспомогательный класс, но функция здесь требует (и модифицирует) довольно много внутренних переменных / полей. Отправка их всех в качестве (справочных) параметров будет выглядеть плохо.
- Моя интуиция говорит мне, что шаблон адаптера может иметь здесь место, некоторый класс для преобразования между двумя при необходимости. Но это также кажется счастливым.
Я пометил это как независимый от языка, поскольку он применяется ко всем языкам, в которых используется подход «один базовый класс - много интерфейсов».
Также, пожалуйста, укажите, возможно, я неправильно понял какой-либо из названных мной шаблонов.
В C ++ я просто создал бы класс с закрытыми полями для реализации этой функции и поместил бы его в список наследования. Какой правильный подход в C # / Java и тому подобное?