2016-05-10 1 views
1

У меня несколько представлений, простирающихся Android каркасных классов:Как добавить логику повторного использования к классам, уже расширяющим другую?

class A extends ImageView  // ImageView extends android.View 

class B extends TextView  //TextView extends android.View 

class C extends LinearLayout  //LinearLayout extends android.ViewGroup which extends android.View 

У меня есть операции, которые могут быть применены к android.view

void notifyError(){ 
    getParentView().notifyError()  //I have type checks on getParentView() 
} 

Описанные выше методом является чрезмерно упрощенной версией одного из таких методы. Важной частью является:

  1. Все виды должны иметь метод notifyError()
  2. код в notifyError это точно то же самое для всех просмотров

В идеале я должен иметь абстрактный класс которые могут распространяться все взгляды. Я мог бы дать базовую реализацию notifyError() в абстрактном классе и все хорошо. Но это решение выходит за рамки, поскольку представление не может распространяться на несколько классов.

Решение, которое у меня есть, состоит в том, чтобы все мои представления реализовали интерфейс, который заставляет все виды переопределять notifyError(). Я создал статический вспомогательный класс, который затем вызывается функцией notifyError(). Все мои представления имеют код для вызова класса-помощника в методах notifyError(). Эта избыточность мне не подходит.

Есть ли лучший способ достичь этого? В случае, если кто-то интересуется этим требованием, вот оно: Если какое-либо из моих представлений-потомков получит ошибку, я хочу рекурсивно уведомить всех родителей об этой ошибке (пока мы не достигнем самой верхней родительской иерархии взглядов). У всех родителей одинаковая логика обработки ошибок для каждого ребенка.

EDIT: На основе комментариев, позвольте мне поделиться упрощенной обработки ошибок логики для notifyError() метод:

void notifyError(Exception e){ 
    Log.e(TAG, e.getMessage()); 
    getParentView().notifyError(e); 
} 
+1

Я не вижу проблемы с абстрактным классом. Вы можете расширить свой абстрактный класс 'android.View', и ваши представления расширят ваш абстрактный класс. В противном случае я не знаю, может ли ваша версия Android использовать Java 8, но имейте в виду, что интерфейсы могут иметь стандартные (конкретные) методы в Java 8. Наконец, когда наследование не работает, следующим вариантом обычно является состав – Dici

+0

ImageView, TextView и т. Д. - это рамки, предоставляемые классами с большой логикой, которые я не могу написать самостоятельно. Расширение просмотра напрямую - это кошмар! – SlowAndSteady

+0

О, ладно, я думал, что это было твое. – Dici

ответ

0

Способы по умолчанию в интерфейсах Java 8, похоже, решают эту проблему. Хотя я не могу использовать Java 8, если я не перенесу свою минимальную поддерживаемую версию Android на 24; этот подход был бы правильным способом на платформах, поддерживающих Java 8, и, следовательно, отмечая этот ответ как принятый.

0

Поскольку Java не поддерживают мульти-наследование, вы должны использовать интерфейс.

Возможный дубликат: How to inherit from multiple base classes in Java?

Так что ваши швы реализации, чтобы быть хорошим.

+1

Звучит как комментарий, а не ответ, плюс у него уже есть интерфейс. – Dici

+0

Согласитесь, он не может действительно лучше. – sonique

+0

С текущий вопрос, нет: p Но, может быть, это неправильный вопрос – Dici

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