2013-11-18 4 views
1

Есть методы и атрибуты, которые я хотел бы разделить между действиями. Например.A BaseActivity для всех видов деятельности, возможно?

public class BaseActivity extends Activity 

будет родителем для другой деятельности

public class MainActivity extends BaseActivity 

НО если ребенок активность является, например, ListActivity это невозможно, не так ли? Нужен ли мне базовый класс для ListActivity? Это будет избыточный код.

Я мог бы преобразовать ListActivity в Activity, но это было бы более необходимым кодом.

Любые предложения?

+0

Что вы имеете в виду с избыточным? – Blackbelt

+0

@blackbelt Я использую те же методы для активности и активности списка, но для активности списка мне нужен другой базовый класс с теми же методами, что и у другого базового класса, и это приведет к избыточности –

ответ

5

Да, вы правы. Поскольку java не поддерживает множественное наследование, класс может иметь только один базовый класс.

Но вы можете работать через делегирование вместо наследования: поместите свои методы в отдельный класс (который НЕ наследует Activity) и использует его в своих действиях. Затем вы можете свести избыточный код (создание и удерживание экземпляра) до минимума.

Смотрите также:

http://sourcemaking.com/refactoring/replace-inheritance-with-delegation

How do I implement multiple inheritence in Java

+0

идеальное решение, большие пальцы! –

0

, если вы хотите поделиться некоторыми методами лучший способ это impelement интерфейс или сделать абстрактный класс для baseactivty.

1

Я использую мой Activities таким образом, и я действительно счастлив, что я это делаю. Конечно, вы должны внести некоторые изменения (например, ListActivity, которые вы упомянули в своем вопросе), но у меня есть больше преимуществ, чем недостатки, на мой взгляд.

В моем приложении мне не нужно беспокоиться о отправке данных Analytics каждый раз, когда я создаю новый Activity, и мне также не нужно беспокоиться о настройке BroadcastReceiver s Мне нужно в каждом классе, я просто сделал свой BaseActivity аннотация и иметь абстрактную функцию, которую я называю каждый раз, когда мой BaseActivity получает трансляцию.

4

Для случая ListActivity я бы создал BaseListActivity, который простирается от BaseActivity. BaseListActivity будет содержать getListView(), который возвращает ListView, если он действительно нужен, защищенный метод setAdapter(), который получает Adapter/ListAdapter. Вы также можете создать некоторые защищенные методы, позволяющие показывать пустое представление, чтобы включить это поведение и вернуть идентификаторы для вашего пустого представления и ListView. По умолчанию они должны указывать на android.R.id.list/android.R.id.empty. Но вы можете переопределить это в своей дочерней деятельности.
В конце концов, это вопрос ООП и не столько специфический для Android. Если вы проверите реализацию ListActivity, вы увидите, как просто сделать свою собственную реализацию BaseListActivity. В конечном итоге более важно иметь последовательную и надежную иерархию классов.

0

Как указывали другие, вам необходимо использовать композицию, поскольку на Java невозможно наследовать множественное наследование. В этом случае answer объясняет, как это сделать в случае действий Android.

Смежные вопросы