Шаблон проектирования множественного наследования Java? - PullRequest
2 голосов
/ 04 декабря 2011

У меня есть такая структура:

Class1</p> <p>Class2 extends Class1

У меня есть куча вспомогательных классов на стороне, которые берут Class2 для выполнения всех видов работы.

Проблема: мне нужно создать Class3, расширяющий Class2, чтобы использовать эти классы.Class3 будет иметь Android MapView Google API.MapViews могут быть созданы ТОЛЬКО ИЗ КЛАССА, РАСШИРЯЮЩЕГО MapActivity.Мне нужно было бы

Class3 extends Class2 AND MapActivity.

, чего нельзя сделать.

Изменение моего класса 3 только для расширения MapActivity потребовало бы от меня накопления кода, унаследованного (без каламбура) от предыдущих разработчиков.

Изменение моего class3 только для расширения разрывов Class2, потому что карта требует MapActivity.

Какой будет наилучший подход?

РЕДАКТИРОВАТЬ: Несколько человек упомянули «интерфейсное решение».Похоже, правильное решение.Однако я забыл упомянуть, что Class2 - это класс abstract , и будет трудно перемещать реализованные методы.Много повторений кода ... СУХОЙ на этом мокрый ...:)

Ответы [ 5 ]

2 голосов
/ 04 декабря 2011

Поскольку Java не поддерживает множественное наследование, вам нужно обойти это. Если бы я был тобой, я бы сделал интерфейс, который определил бы все, что тебе нужно, а затем просто расширил бы Class1

OR

Вы можете просто сделать Class1 продление MapActivity, если оно уже не расширяет что-то еще, но вы действительно захотите сделать это, только если Class2 должно расширить MapActivity. Ваш Class2 может расширяться Class1, а Class3 может расширяться Class1, а Class1 может расширяться MapActivity.

Надеюсь, это помогло!

1 голос
/ 04 декабря 2011

Из того, что я видел, наиболее java-подобное решение этой проблемы заключается в следующем:

  1. Обычно старайтесь использовать интерфейсы для определения типов, которые необходимо расширить.Например, JTable использует интерфейс TableModel, который может быть реализован с нуля или путем расширения AbstractTableModel или DefaultTableModel

  2. Понятно, что это не всегда возможно.В вашем случае вы можете создать Class3 с закрытым полем типа Class1.Затем реализуйте столько методов-оболочек, сколько требуется для передачи всех входящих методов во внутренний объект.

Конечно, (2) даст вам все поведение Class1, но не будетна самом деле это экземпляр Class1, который может сломать что-то еще в вашей системе.Ответом на эту проблему является (снова) более широкое использование интерфейсов.

0 голосов
/ 04 декабря 2011

да. Найл С. прав. Я новичок в этом, но я знаю, что Java не поддерживает Mutliple Inheritance of Classes вместо этого. Вы можете создать интерфейс, который определяет все методы и члены, которые вы хотите использовать, и реализовать его.

0 голосов
/ 04 декабря 2011

Можете ли вы создать Class4, который расширяет MapActivity, и использовать Class3 в качестве композиции внутри Class4.Тогда вы можете делегировать в API класса 3.Очевидно, это будет работать, если вам не нужен доступ к некоторым внутренним компонентам Class3 и выше.

Если вам нужен доступ к внутренним компонентам Class3, то вы можете иметь Class5 extension Class3 для создания apis, который может помочь преодолеть это ограничениене имеет доступа к внутренним органам.

0 голосов
/ 04 декабря 2011

Вместо того, чтобы иметь класс 3, расширяющий MapActivity, почему бы не попробовать реализовать его?У меня была такая же проблема, как и у вас, и я решил ее с помощью орудий.

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