2012-01-31 2 views
2

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

Я разрабатываю приложение для 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 

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

Спасибо.

+0

какая ОС вы нацеливаете? Это решается с помощью фрагментов в OS 3+ – L7ColWinters

+0

Я нацелен на Android 2.1. –

ответ

3

Я хотел бы использовать композицию вместо наследования для 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.

+0

Спасибо, я подумал о том, чтобы сделать что-то подобное, но я не смог найти правильный способ сделать это! –

1

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

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

2

Активность вкладок.

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

+0

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

+0

ИСПОЛЬЗОВАНИЕ ФРАГМЕНТОВ ... – L7ColWinters

0

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

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