2013-11-28 4 views
0

나는 클래스 디자인에 대해 더 많이 배우려고 노력 중이며 딜레마에 빠져있다. 판매, 판매자 및 구매자의 세 가지 추상화가있는 온라인 경매가 있다고 가정 해보십시오. A 판매 판매자와 구매자가 있습니다. 두 판매자와 구매자는 이름, 전화 번호 및 주소와 같은 유사한 필드 세트를 가지며이를 하나의 클래스, 즉 사람으로 그룹화하는 것이 좋습니다. 그런 다음 Abstract Person 클래스의 필드와 접근 자에 대해 코드를 집중화하고 Teacher 및 Student에 대한 특정 유형을 사용할 수 있습니다.추상 메서드 vs 상속

class Sale { 
    Person teacher; 
    Person student; 

    String description; 
    int hourlyRate; 

    // Some lesson methods 
} 

abstract class Person { 
    private String name; 
    private String address; 
    private String telephoneNumber; 
    // Getters & setters... 
} 

class Seller extends Person { 
    // Some teacher stuff 
} 

class Buyer extends Person { 
    // Some student stuff 
} 

지금, 애플리케이션 요구 사항이 기업 간 고객을 포함하지만, 판매자와 구매자가 입력 한 사람의 때문에, 그들은 우리의 클래스 계층 구조에 맞지 않는이 같은 코드로 이어질 수

. 인터페이스를 사용했다면이를 막을 수 있었지만 다른 연락처 필드를 복제해야했습니다.

이 상황에서 가장 좋은 방법은 무엇입니까?

+1

가 구성보다는 상속을 통해 확장을 고려 정말 중요한 비즈니스 관련 기능에 당신의 유형 계층 구조를 유지하면서 따라서

class Identity { private String name; private String address; private String telephoneNumber; // Getters & setters... // behaviours } class Seller { private Identity identity; // Getters & Setters // behaviours } class Buyer { private Identity identity; // Getters & Setters // behaviours } 

, 당신은 구매자와 판매자 클래스를 통해 신원 연락처 정보 관련 행동을 공유 할 수 있습니다. 그리고 이렇게하면 추상적 인 클래스와 인터페이스를 사용할 수 있습니다. 판매자와 구매자는 인터페이스에 의해 정의 된 일종의 에이전트를 포함하고 있으며, 추상 클래스는 인터페이스를 구현합니다. 추상 비즈니스 클라이언트는 인터페이스를 구현합니다. –

+0

@HovercraftFullOfEels 예제를 제공해 주시겠습니까? – kiruwka

+0

중요한 질문은 사람이 ** 판매자가 될 수도 있고 구매자가 될 수도 있다는 것입니다. –

답변

0

이름 바꾸기 NaturalPerson에 사람 및 해당 관할 지역의 피팅 수 있습니다 BusinessObject 또는 어떤 이름에서 파생. 그런 다음 PersonBusiness을 파생시킬 수 있습니다.

3

상속보다는 구성을 통한 확장을 고려하십시오. 그리고 이렇게하면 추상적 인 클래스와 인터페이스를 사용할 수 있습니다. 판매자와 구매자는 인터페이스에 의해 정의 된 일종의 에이전트를 포함하고 있으며, 추상 클래스는 인터페이스를 구현합니다. 추상 비즈니스 클라이언트는 인터페이스를 구현합니다. 그런 다음 예를

// both buyer and seller 
class BusinessEntity { 
    // an interface that can be a person, or a business 
    private Agent agent; 

Person 클래스의 경우

...

abstract class Person implements Agent { 

} 

및 비즈니스 클래스

abstract class Business implements Agent { 

} 

하고 쉽게 될 수 있도록 물건을 설정하는 것이 좋습니다 의존성 주입을 사용하여 BusinessEntity가 보유한 에이전트를 변경하십시오.

1

비즈니스의 일부는 아니지만 공유 도구 인 연락처 필드에 상속을 통한 합성 사용을 고려하십시오. 예를 들어 :