У меня есть куча классов, таких как:
abstract class Product {
BigDecimal price
String name
}
class EdibleProduct extends Product {
Date sellByDate
}
class FinancialProduct extends Product {
Currency currency
}
В действительности существует более 2 подклассов, и каждый подкласс добавляет более одного свойства к родительскому. Я хотел бы использовать эти классы с API, например:
interface ProductDao {
Product create(Product product)
Product update(Product product)
}
С наивной моделью, предложенной выше, нужно будет сделать что-то подобное в рамках реализации ProductDao
методов
Product create(Product product) {
// save the fields common to all Products
if (product instanceof EdibleProduct) {
// save fields specific to this implementation
} else if (product instanceof FinancialProduct) {
// save fields specific to this implementation
}
}
Очевидно, приведение к типу реализации, как это отстой, поэтому я ищу способы создания, обновления и т. Д. Различных видов продуктов без ссылки на типы реализации (по крайней мере, в реализации ProductDao
).
Я рассмотрел различные решения, большинство из которых включают удаление подклассов и перемещение полей, специфичных для продукта, в отдельные классы, которые реализуют один и тот же интерфейс, что-то вроде
interface ProductType {}
class EdibleProductType {
Date sellByDate
}
class FinancialProductType {
Currency currency
}
затем добавление поля ProductType
к Product
. Я также подумал об использовании декоратора, но, похоже, это не избавит от необходимости опускать руки.
Языком реализации будет Java или Groovy.