2010-04-21 3 views
2

다음 세 가지 디자인 패턴에 대한 stackoverflow 커뮤니티 의견을 얻고 싶습니다. 첫 번째는 구현 상속입니다. 두 번째는 인터페이스 상속이다. 세 번째는 중간 지점입니다. 내 구체적인 질문은 : 어느 것이 가장 좋습니다?구현/인터페이스 상속 디자인 질문

구현 상속 :

class Base { 
    X x() const = 0; 
    void UpdateX(A a) { y_ = g(a); } 
    Y y_; 
} 

class Derived: Base { 
    X x() const { return f(y_); } 
} 

인터페이스 상속 :

class Base { 
    X x() const = 0; 
    void UpdateX(A a) = 0; 
} 

class Derived: Base { 
    X x() const { return x_; } 
    void UpdateX(A a) { x_ = f(g(a)); } 
    X x_; 
} 

중간 :

class Base { 
    X x() const { return x_; } 
    void UpdateX(A a) = 0; 
    X x_; 
} 

class Derived: Base { 
    void UpdateX(A a) { x_ = f(g(a)); } 
} 

나는 많은 사람들이 구현 상속에 인터페이스 상속을 선호하는 것을 알고있다. 그러나 후자의 이점은 Base에 대한 포인터를 사용하면 x()를 인라인 할 수 있고 x_의 주소를 정적으로 계산할 수 있다는 것입니다.

답변

0

나는 아무도 기술은 본질적으로 더 나은 다른 사람보다 없다고 말할 것입니다. 그것들은 사용되는 상황에 따라 다른 시나리오에서 모두 유용합니다.

Composite Pattern을 구현하는 경우 대부분의 클래스는 동일한 구현을 사용하고 구현 상속은 아마도 갈 방법입니다. 필요로하는 클래스에 대한 구현을 수정하고 그렇지 않은 클래스에 대해서는 코드를 공유 할 수 있습니다.

각 클래스의 메서드 구현이 완전히 다를 가능성이있는 Visitor Pattern을 구현하는 경우 인터페이스 상속이 가장 적합 할 수 있습니다. 이 경우 기본 클래스 구현은 아마도 단일 클래스에서만 사용됩니다.

객체 지향 기술을 사용하여 설계되지 않은 프로젝트를 상속하는 경우 유용한 예가 유용하다는 것을 알 수 있습니다. 어쩌면 새로운 기능을 추가하는 동안 리팩토링해야 할 수도 있으며, 레거시 코드를 객체 지향 디자인을 사용하는 새 코드와 상호 작용하는 방법으로 사용할 수도 있습니다. 이것은 실제 "모범 사례"보다 절충안이지만 제품을 출하하기 위해서는 모두 제품을 만들어야합니다 ... 더 나은 /보다 구체적인 예를 생각하면 게시 할 것입니다.

0

입력에 g(a) 변형을 사용하는 파생 클래스가 여러 개있는 경우 코드 반복을 피하기 위해 첫 번째 옵션을 사용합니다. 나는 요소 어드레싱을 최적화하는 것보다 더 높은 목표라고 생각한다.