#java #android #design-patterns #hierarchy #superclass
#java #Android #дизайн-шаблоны #иерархия #суперкласс
Вопрос:
Я работаю над приложением для Android и столкнулся с проблемой рефакторинга; для большинства моих действий требуются определенные возможности уведомления, то есть отображение всплывающего сообщения. Это обрабатывается суперклассом, который расширяет активность
Активность
-NotificationActivity
—MyActivityA
—MyActivityB
и так далее. Затем я решил провести рефакторинг двух своих действий, в которых используется счетчик, заполняемый курсором базы данных. Иерархия теперь выглядит следующим образом:
Активность
-MyNotificationActivity
—MyActivityA
—MyActivityB
—MySpinnerActivity (настраивает счетчик и курсор)
—MySpinnerActivityA
—MySpinnerActivityB
Проблема, с которой я сталкиваюсь сейчас, заключается в следующем — я пишу новый класс Activity, который также будет использовать курсор базы данных, но для заполнения ListView. Я хотел бы расширить ListView, чтобы использовать встроенное в Android управление списками, но мне также нужен доступ к методам настройки курсора и методам уведомлений, которые уже существуют в моей иерархии классов.
Я действительно стремлюсь избежать дублирования кода. Есть предложения?
Приветствую, Барри
Комментарии:
1. Просто подумал — я мог бы попробовать, чтобы мой суперкласс NotificationActivity расширял ListActivity, а не Activity. Не очень «приятный», хотя ни одному из моих других действий не нужен список.
Ответ №1:
При решении аналогичной проблемы (куча действий, которые показывают ProgressDialogs), я избегал расширения суперкласса функциональностью ProgressDialog.
Вместо этого я написал отдельный класс «LoadingDialog», чтобы справиться с этим. В каждом действии, которому требовалась эта функциональность, у него был бы экземпляр класса LoadingDialog в качестве поля. И для любой функциональности, зависящей от контекста или действия, действие может передавать ссылку на себя или предоставлять другие части самого себя по мере необходимости.
В вашем случае, возможно, вы могли бы написать какой-нибудь «ToasterFunctionClass», который инкапсулирует общую функциональность, и иметь его экземпляр в каждом из соответствующих действий.
public class ListStuff extends ListActivity {
private ToastFunctionClass toaster = new ToastFunctionClass(this); //pass yourself so that toaster has a Context in which to do UI stuff.
onSomethingHappened() {
toaster.showToast("Something happened");
}
}