Вопрос / проблема наследования - PullRequest
0 голосов
/ 05 июня 2010

Я создаю собственный макет для Android. Реализация макета точно такая же, но однажды мне нужно перейти от RelativeLayout и один раз от LinearLayout.

class Layout1 extends LinearLayout {
// methods and fields
}

class Layout2 extends RelativeLayout {
// the same EXACT methods and fields
}

Как я могу использовать наследование, чтобы избежать дублирования кода и реализовать мои методы один раз.

Ответы [ 3 ]

2 голосов
/ 05 июня 2010

Вы можете использовать композицию и что-то вроде паттерна "стратегия":

class YourLayout extends ViewGroup {
    ViewGroup strategy;
    public YourLayout( Condition someCondition ) {
       if( someCondition.useLinear() ) {
            strategy = new LinearLayout(); // or Layout1
       } else {
            strategy = new RelativeLayout();
       }
    }
    public View findFocus() {
        return strategy.findFocus();
    }
    .... rest of the methods:
    / rest of specific EXACT methods and fields
 }

Вы можете даже изменить strategy во время выполнения.

Таким образом, ваш класс YourLayout может использовать оба сценария.

0 голосов
/ 10 июня 2010

Я использовал делегирование, хотя и несколько иначе. Единственный перегруженный метод в моем классе - это перегруженный dispatchDraw. Поэтому я переместил его в другой класс и включил его экземпляр в каждый из расширяющихся классов.

 class MyLinearLayout extends LinearLayout {
        MyDraw md = new MyDraw();

        @Override
        protected void dispatchDraw(Canvas canvas) {    
            md.draw(canvas);
            super.dispatchDraw(canvas);
        }
 }

 class MyRelativeLayout extends RelativeLayout {
      //    as above
 }

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

0 голосов
/ 05 июня 2010

Я не знаю, подойдет ли он для вашего варианта использования, но вы можете рассмотреть возможность использования делегирования, добавив поле класса "other".

Я пессимистичен, хотя классы слишком тесно связаны.

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