Несколько суперклассов и повторное использование кода
Этот вопрос связан с Android в том, что моя потребность существует в этом домене, но этот вопрос по-прежнему применяется к Java в целом; Я буду использовать некоторые условия Android здесь, такие как Activity
, FragmentActivity
, ListActivity
и т.д.
Мне нужно реализовать абстрактный базовый класс, который содержит функциональные возможности, которые должны использоваться во всем приложении, более конкретно каждый Activity
должен использовать эту функциональность, но я хочу, чтобы он обрабатывался автоматически базовым классом. Моя проблема заключается в том, что у меня есть много разных видов деятельности в приложении, таких как Activity
, FragmentActivity
и ListActivity
, все из которых расширяют Activity
(минус Activity
, конечно).
Поскольку код в базовом классе будет точно таким же для каждой реализации Activity
, существует ли способ избежать дублирования кода и необходимо создать базовый класс для каждого типа Activity
?
То, что я пытаюсь избежать:
public abstract class BaseActivity extends Activity
{
public void onCreate(Bundle savedBundle)
{
// code goes here, will be the exact same for all these base classes
}
}
public abstract class BaseFragmentActivity extends FragmentActivity
{
public void onCreate(Bundle savedBundle)
{
// code goes here, will be the exact same for all these base classes
}
}
public abstract class BaseListActivity extends ListActivity
{
public void onCreate(Bundle savedBundle)
{
// code goes here, will be the exact same for all these base classes
}
}
public class MyMainActivity extends BaseActivity
{
}
public class MyUserList extends BaseListActivity
{
}
public class SomeActivityThatNeedsToBeAFragment extends BaseFragmentActivity
{
}
Я пытался использовать для этого дженерики, используя что-то вроде следующего
public abstract class BaseActivity<T extends Activity> extends T
но, очевидно, это не сработает; или, может быть, я просто делаю это неправильно. Итак, есть ли способ выполнить повторное использование этого кода и избежать дублирования, или просто просто застрял, дублируя мой код?
Спасибо!
Ответы
Ответ 1
Часто, использование фрагментов может помочь в решении этой проблемы. В вашем конкретном случае, хотя я вижу, что вы также хотите использовать ListActivity. Это усложняет
Как вы знаете, Java не может вам помочь. Вы не можете наследовать несколько реализаций (List и MyBase). Нет простого ответа. Я могу предложить две вещи:
-
Список (Activity, Fragment) - довольно простые расширения для базовых классов. Вы могли бы с разумным объемом работы создать свой собственный, который наследуется от вашего базового класса. Они, вероятно, были бы проще, чем те, которые были в рамках. Возможно, это будет нормально.
- делегат
. Напишите класс, который реализует общее поведение, но не наследует от Activity/Fragment. Создайте один из этих объектов во время инициализации ваших классов фрагментов/действий. Каждый раз, когда есть общее поведение, делегируйте его экземпляру делегата.
Ответ 2
Создайте абстрактный класс под названием BaseActivity
. Внесите onCreate()
для него, который должен охватывать основы операций. Создайте другие классы, которые простираются от BaseActivity
, и позволяют им переопределять этот метод тогда и только тогда, когда они делают что-то немного более специальное, чем BaseActivity
.
Основная идея здесь заключается в том, что любой Activity
, который вы создали или создаете, так или иначе связан с тем, что они выполняют аналогичные операции с кодом. Только в особых случаях вам нужно было бы сделать что-то дополнительное, отсюда переопределение onCreate()
.