2016-12-02 10 views
0

X, Y 및 Z가 모두 올바르게 작동하도록 모든 클래스를 구현해야한다고 가정 해 봅시다. 이 경우,이를 강제하기 위해 공통 인터페이스를 구현하도록 할 수 있습니다.강제 클래스가 메소드 집합 중 하나를 구현하도록 강요합니다

이제 내 경우는 약간 다릅니다. 을 구현해야합니다. 중 하나 이상 X, Y 및 Z 중 하나 이상을 반드시 구현해야합니다. 인터페이스는 여기서 나를 도울 수 없습니다. 제가 생각할 수있는 가장 가까운 것은 일반적인 부모입니다 - 그것은 X, Y 또는 Z의 존재를 구조사에서 점검 할 수 있습니다.

나는 이미 부모가있는 클래스에서이 "인터페이스"를 구현해야하기 때문에 여기에서는 상속을 피하고 싶습니다. 그래서 - 이것을하는 또 다른 우아한 방법이 있습니까?

(내가 PHP하고 있어요,하지만 일반적인 OOP 솔루션이 존재하는 경우, 그것은 폭 넓은 고객에게 제공 할 수 있습니다.)

+0

인터페이스가 도움이 될 수 있습니다. 이러한 인터페이스를 공통 인터페이스로 확장하십시오. 당신이 매번 어떤 것이 있는지 확인하고 싶지 않다면, 당신은 상속없이 이것을 어떻게 할 것인지를 아십시오. –

+3

나쁜 아키텍처/디자인과 비슷합니다. "X, Y, Z 중 적어도 하나를 구현해야"하는 이유를 설명해주십시오 (실제 시나리오를 보여주십시오)? –

+0

@WaxCage 우리는 설정 값 접근을위한 클래스를 가지고 있습니다. 일부는 DB에서, 다른 하나는 설정 파일에서, 다른 하나는 하드 코딩 된 배열에서 가져올 수 있습니다. getAsString(), getAsParamObject() ... 또는 이와 유사한 메소드를 통해 이러한 클래스에서 값을 가져올 수 있습니다. 그것은 분명히 나쁜 디자인이지만, 지금은 내가 함께해야만하는 디자인입니다. 이러한 설정 클래스는 종종 수정되고 (깨지기 때문에) 모든 것을 리팩터링하기 전에 기본 함수를 보호하고 싶습니다 (최소한 어떻게 든 값을 얻으려고). –

답변

1
내가 구현해야 할 수도 있기 때문에 차라리 여기에 상속을 피할 것

이 " 이미 부모가있는 클래스의 "인터페이스"로 대체됩니다. 그래서 - 이것을하는 또 다른 우아한 방법이 있습니까? 내가 제대로 이해하면

, 당신은 Traits을 통해이 문제를 해결할 수 있습니다 :

trait DefaultImpl 
{ 
    public function x() 
    { 
     echo "Default implementation of x()\n"; 
    } 

    public function y() 
    { 
     echo "Default implementation of y()\n"; 
    } 

    public function z() 
    { 
     echo "Default implementation of z()\n"; 
    } 
} 

class XImpl 
{ 
    use DefaultImpl; 

    public function x() 
    { 
     echo "Custom implementation of X\n"; 
    } 
} 

$x = new XImpl(); 
$x->x(); 
$x->y(); 
$x->z(); 

그것은보기의 디자인 관점에서 매우 좋은 해결책이 아니다. 그러나 불필요한 상속보다 낫습니다.