Следующий код работает очень хорошо, когда все участвующие классы находятся в одном проекте (determineSubClass
является членом BaseClass
):
protected static BaseClass determineSubClass(String p1, int p2, Boolean p3) {
BaseClass baseObj = null;
if ( (baseObj = SubClassOne.ofType(p1, p2, p3)) != null )
return baseObj;
else if ( (baseObj = SubClassTwo.ofType(p1, p2, p3)) != null )
return baseObj;
else if ( (baseObj = SubClassThree.ofType(p1, p2, p3)) != null )
return baseObj;
else if ( (baseObj = SubClassFour.ofType(p1, p2, p3)) != null )
return baseObj;
else
return new SubClassDefault(p1, p2, p3);
}
Но теперь я хочу переместить BaseClass
в проект общей библиотеки, в котором SubClassOne
, SubClassTwo
, SubClassThree
и SubClassFour
не определены в библиотеке, но скорее в приложениях, использующих эту библиотеку.
Конечно, я могу переместить BaseClass
назад к каждому приложению, использующему эту библиотеку, но мне интересно:
- Есть ли лучшее решение?
- Есть ли решение, которое позволило бы мне
хранить
BaseClass
в библиотеке
проект и устранить необходимость в этом
знать обо всех суперклассах
происходит от этого?
РЕДАКТИРОВАТЬ (отвечая на вопрос @ahmet alp balkan ниже):
ofType()
каждого подкласса делает 2 вещи:
- Определяет, основываясь на содержании
Строка p1 и другие параметры
p2 и p3, является ли подкласс
быть экземпляром его типа.
- Если ответ положительный, это
создает объект себя
подкласс. В противном случае возвращает ноль.
Что касается вашего второго вопроса, BaseClass
на данный момент содержит общие элементы данных и методы для всех подклассов и только этот единственный статический метод, который нацелен на делегирование ответственности за определение подкласса, подлежащего реализации.
Кстати, благодаря вашему вопросу я заметил ужасную опечатку в своем оригинальном сообщении: «SuperClassOne» должен быть «SubClassOne» и т. Д.