인터페이스 (상속이 아님) 또는 일종의 속성 메커니즘 (자원 설명 프레임 워크와 같은 기능)을 사용해야합니다.
그래서
interface Colored {
Color getColor();
}
class ColoredBook extends Book implements Colored {
...
}
또는
class PropertiesHolder {
<T> extends Property<?>> Optional<T> getProperty( Class<T> propertyClass ) { ... }
<V, T extends Property<V>> Optional<V> getPropertyValue( Class<T> propertyClass ) { ... }
}
interface Property<T> {
String getName();
T getValue();
}
class ColorProperty implements Property<Color> {
public Color getValue() { ... }
public String getName() { return "color"; }
}
class Book extends PropertiesHolder {
}
설명 (편집) :
엔티티 클래스에 옵션 필드를 추가하기 만하면됩니다.
특히 Optional-wrapper (편집 : 4castle 의 답변 참조 )를 사용하면이 (원래 엔터티에 필드 추가)가 작은 규모로 새 속성을 추가하는 실용적인 방법이라고 생각합니다. 이 방법의 가장 큰 문제점은 낮은 커플 링에 대해 작동 할 수 있다는 것입니다.
책 클래스가 도메인 모델 전용 프로젝트에 정의되어 있다고 가정하십시오. 이제 도메인 모델을 사용하여 특별한 작업을 수행하는 다른 프로젝트를 추가합니다. 이 작업에는 서적에 추가 속성이 필요합니다. 상속으로 끝나거나 (아래 참조) 새 작업을 수행 할 수 있도록 공통 도메인 모델을 변경해야합니다. 후자의 경우 책 클래스에 추가 된 자체 속성에 의존하는 여러 프로젝트가 생길 수 있지만 책 클래스 자체는 이러한 프로젝트에 의존합니다. 왜냐하면 책 클래스가 없으면 책 클래스를 이해할 수 없기 때문입니다. 추가 프로젝트.
추가 속성을 제공 할 때 상속이 왜 문제가됩니까?
"Book"예제 클래스를 볼 때 종종 많은 선택적 필드와 하위 유형이있는 도메인 개체에 대해 생각합니다. CD가 포함 된 책의 속성을 추가한다고 가정 해보십시오. 컬러 책, 책, CD와 책, 색상 책 : 네 책의 종류 지금있다 및 CD는. Java에서 상속으로이 상황을 설명 할 수 없습니다.
인터페이스를 사용하면이 문제를 피할 수 있습니다. 인터페이스를 사용하여 특정 책 클래스의 속성을 쉽게 구성 할 수 있습니다. 위임과 작문은 원하는 수업을 쉽게 얻을 수 있도록 도와줍니다. 상속을 사용하면 일반적으로 형제 클래스에 필요하기 때문에 클래스에있는 선택적 속성이 생깁니다.
상속이 종종 문제가되는 아이디어 인 이유를 더 읽어보십시오.
상속이 OOP 지지자들에 의해 일반적으로 나쁜 것으로 여겨지는 이유는 무엇입니까?
JavaWorld : 확장이 악인 이유
일련의 속성을 구성하기 위해 일련의 인터페이스를 구현할 때의 문제
확장을 위해 인터페이스를 사용할 때 작은 세트 만 있으면 모든 것이 좋습니다. 특히 객체 모델이 다른 개발자 (예 : 회사)에서 사용되고 확장되면 인터페이스의 양이 늘어납니다. 그리고 결국 당신은 동료들이 완전히 관련없는 유스 케이스 인 Ugh를 위해 동료들이 이미 고객 X 프로젝트에서 사용한 방법을 추가하는 새로운 공식 "속성 인터페이스"를 만들게됩니다.
편집 : 또 다른 중요한 측면은 gnasher729에 의해 언급됩니다 . 기존 객체에 선택적 속성을 동적으로 추가하려는 경우가 종종 있습니다. 상속 또는 인터페이스를 사용하면 선택 사항과는 다른 클래스를 사용하여 전체 객체를 다시 만들어야합니다.
이러한 정도까지 객체 모델에 대한 확장을 기대할 경우 동적 확장 의 가능성을 명시 적으로 모델링하면 더 나아질 것 입니다. 각 "확장"(이 경우 속성)에 자체 클래스가있는 위와 같은 것을 제안합니다. 클래스는 확장의 네임 스페이스 및 식별자로 작동합니다. 따라서 패키지 명명 규칙을 설정하면이 방법으로 원래 엔터티 클래스의 메서드에 대한 네임 스페이스를 오염시키지 않으면 서 무한한 확장이 가능합니다.
게임 개발에서는 종종 행동과 데이터를 다양한 형태로 구성하려는 상황에 처하게됩니다. 그렇기 때문에 게임 패턴 분야에서 아키텍처 패턴 엔터티 구성 요소 시스템 이 인기를 얻었습니다. 이것은 또한 객체 모델에 대한 많은 확장을 기대할 때보고 싶은 흥미로운 접근법입니다.