Совместное использование общих функций между различными видами деятельности - PullRequest
3 голосов
/ 25 ноября 2010

Я хочу предоставить общие функциональные возможности для различных типов действий, таких как открытие и закрытие соединения с базой данных.Рассмотрим следующий класс:

public class DataActivity extends Activity {

    private DbAdapter mDbAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        //open database
        mDbAdapter = new DbAdapter(this);
        mDbAdapter.open();

}

    @Override
    protected void onDestroy() {

        super.onDestroy();
        //close database
        mDbAdapter.close();

    }

    public DbAdapter getDbAdapter() {
        return mDbAdapter;
    }

}

Тогда я мог бы просто расширить DataActivity и получить доступ к своим данным в классе.Однако, что, если я хотел сделать это для ListActivity или ExpandableListActivity?Мне нужно было бы сделать копию DataActivity и сделать так, чтобы она расширила желаемый класс.

Это кажется действительно грязным, когда есть несколько классов с дублирующимся кодом реализации для каждого типа деятельности, к которому я хотел бы добавить это.

Редактировать Похоже, что я пытаюсьсделать вышеописанное на самом деле невозможно, так как Java спроектирован так, как нет множественного наследования.Есть несколько способов минимизировать дублирование кода, но наследование просто не работает в этом случае.

1 Ответ

0 голосов
/ 25 ноября 2010

Либо наследуя (я рекомендую) от всех этих классов и расширяя их (создавая BaseActivity, BaseMapActivity, BaseXXXActivity ..), либо используя агрегацию, что более логично: Наследование против агрегации . Android основан на Java, поэтому применяются все правила Java и правила ООП.

Например: вы можете создать переменную экземпляра в вашем классе следующим образом: `private DbAdapter dbAdapter = new DbAdapter (this);

В onCreate добавьте вызов open(), в onDestroy вызов close(). Я не вижу необходимости в верхнем примере иметь функцию getAdapter(). Поэтому сохраните хотя бы несколько строк кода.

Чтобы кода было меньше, попробуйте добавить класс DataService, который содержит метод instance(Context ctx) - там вы можете создать DbHelper, если необходимо.

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