Обойти множественное наследование в Java - PullRequest
2 голосов
/ 31 января 2012

Я думаю, что есть решение моей проблемы наследования, но я не могу его найти.

Я занимаюсь разработкой приложения для Android (целью является Android 2.1), которое использует SlidingDrawer (для моего меню) на большинстве страниц. Чтобы не инициализировать его во всех действиях, я создал DefaultActivity для этого. Это работало хорошо, пока мне не пришлось расширять TabActivity, потому что Java не поддерживает множественное наследование.

В основном у меня есть следующие действия по умолчанию

public class DefaultActivity extends Activity{ 
    // Declarations

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Some code
    }

    @Override
    protected void onPause() {
        // Some code
    }

    protected void initializeMenu() {
        // Init
    }
}

Теперь, когда у меня есть активность, я делаю следующее

public class SomeActivity extends DefaultActivity{ 
    // Declarations

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.myLayout);
        super.initializeMenu();
    }
}

Но у меня есть представление, которое расширяет TabActivity, поэтому я не могу сделать

public class SomeOtherActivity extends TabActivity, DefaultActivity

Как я могу сделать, чтобы только один класс расширялся, но который содержит код для Activity и TabActivity?

Спасибо.

Ответы [ 4 ]

3 голосов
/ 01 февраля 2012

Я бы использовал состав вместо наследования для DefaultActivity.

Создайте класс ActivityHelper, который делает все, что делает DefaultActivty. Тогда все ваши действия имеют переменную-член типа ActivityHelper.

  public class ActivityHelper { 
  // Declarations

  @Override
   public boolean onCreateOptionsMenu(Activity activity, Menu menu) {
    // Some code
  }

  @Override
  protected void onPause(activity) {
    // Some code
   }

   protected void initializeMenu(activity) {
    // Init


   }
}

public class MyActivity extends Activity { 
  private final ActivityHelper helper;

  @Override
   public boolean onCreateOptionsMenu(Menu menu) {
    helper.onCreateOptionsMenu(this, menu)
  }

  @Override
  protected void onPause() {
    helper.onPause(this);
  }

   protected void initializeMenu() {
     helper.initializeMenu(this)
   }
}

Это немного больше кода, но гораздо более гибкий. Это будет работать только в том случае, если ваша DefaultActivity не использует защищенные методы в Activity.

2 голосов
/ 31 января 2012

Tab Activity.

Этот класс устарел. Новые приложения должны использовать фрагменты вместо этого класса; чтобы продолжить работу на старых устройствах, вы можете использовать библиотеку поддержки v4, которая предоставляет версию API фрагмента, совместимую с DONUT.

1 голос
/ 31 января 2012

Поместите TabActivity в качестве элемента данных вместо его расширения, и делегируйте каждый метод, который вы не хотите переопределять, а другие реализуют сами. Это не решит проблемы, хотя этот метод находится как в DefaultActivity, так и в TabActivity (я думаю, что есть куча ...). Вот почему Java не разрешает множественное наследование:)

Надеюсь, это поможет.

0 голосов
/ 31 января 2012

обычно в общем программировании мы добавляем поле этого объекта для использования множественного наследования

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