Подтвердить что ты не робот

Несколько суперклассов и повторное использование кода

Этот вопрос связан с 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

но, очевидно, это не сработает; или, может быть, я просто делаю это неправильно. Итак, есть ли способ выполнить повторное использование этого кода и избежать дублирования, или просто просто застрял, дублируя мой код?

Спасибо!

4b9b3361

Ответ 1

Часто, использование фрагментов может помочь в решении этой проблемы. В вашем конкретном случае, хотя я вижу, что вы также хотите использовать ListActivity. Это усложняет

Как вы знаете, Java не может вам помочь. Вы не можете наследовать несколько реализаций (List и MyBase). Нет простого ответа. Я могу предложить две вещи:

  • Список (Activity, Fragment) - довольно простые расширения для базовых классов. Вы могли бы с разумным объемом работы создать свой собственный, который наследуется от вашего базового класса. Они, вероятно, были бы проще, чем те, которые были в рамках. Возможно, это будет нормально.

  • делегат

    . Напишите класс, который реализует общее поведение, но не наследует от Activity/Fragment. Создайте один из этих объектов во время инициализации ваших классов фрагментов/действий. Каждый раз, когда есть общее поведение, делегируйте его экземпляру делегата.

Ответ 2

Создайте абстрактный класс под названием BaseActivity. Внесите onCreate() для него, который должен охватывать основы операций. Создайте другие классы, которые простираются от BaseActivity, и позволяют им переопределять этот метод тогда и только тогда, когда они делают что-то немного более специальное, чем BaseActivity.

Основная идея здесь заключается в том, что любой Activity, который вы создали или создаете, так или иначе связан с тем, что они выполняют аналогичные операции с кодом. Только в особых случаях вам нужно было бы сделать что-то дополнительное, отсюда переопределение onCreate().