2017-10-30 2 views
1

나는 다음과 같은 클래스 계층이 : 그것은 잘 작동하지만,이 때문에 슈퍼를 통해 DbRenderer의 생성자를()()를 호출하기 위해 JsonRenderer 생성자에 DB 연결 매개 변수를 전달하는 데 필요한자바 스크립트 매개 변수에 따라 클래스 상속

Renderer (can render some data on screen) 
    | 
DbRenderer (fetch data from the database) 
    | 
JsonRenderer (my class. converts specific data into needed format supported by Renderer) 

을 매개 변수는 거기에 의무적입니다.

그래서, 그것은 같이 보인다 :

Renderer 
     | 
    JsonRenderer 

I :

class JsonRenderer extends DbRenderer {} 

는하지만, 내가 선택 dbParams을하고 다음에 클래스 계층 구조를 변경하려면

const renderer = new JsonRenderer(dbParams); 

, 별도의 수업을 만들어서 할 수 있습니다.

class JsonRenderer2 extends Renderer {} 

물론 다른 수업은 코드 중복의 원인이 될 수 있으며 이는 좋은 생각이 아닙니다.

Renderer 및 DbRenderer 상위 클래스를 변경하지 않고도 상황에 맞는 해결책이 있습니까?

+1

'JsonRenderer'는'DbRenderer'가 아닌 경우'DbRenderer'의 자식이 아니어야합니다. 전반적으로'DbRenderer'가 처음에는'Renderer'를 확장한다는 것이 이상하게 보입니다. 실제로 렌더링 할 수 있습니까, 아니면 다른 렌더러가 사용할 수있는 데이터 소스입니까? 어쩌면 다른 모델이 당신의 우주에 더 적합 할 수도 있습니다. –

+0

'DbRenderer'는 일부 데이터를 가져옵니다. 'JsonRenderer'는이 데이터가 변환되어 화면에 표시하기 위해'Renderer'에 어떻게 전달되는지 알고 있습니다. – vich

+4

'DbRenderer'는'Renderer'을 확장해서는 안됩니다. 'JsonRenderer'에 데이터 소스로 전달되어야하는 것처럼 보입니다. 일반적으로 클래스 상속은 * is-a * 관계에만 사용해야합니다. 예 : 개는 * 동물입니다. –

답변

1

여기에 상속을 잘못 사용했다고 생각합니다. 각 클래스가 무엇에 대한 자세한 내용을 알지 못하고 확실히 말할 어렵다,하지만 난 당신이 대신 다음과 같은 구조를 가질 수있다 같은 느낌 :

 Renderer (can render some data on screen, 
       uses DataSource class instance 
       to get the data to display) 

     DataSource 
    /  \ 
    /   \ 
    /   \ 
DbData   JsonData 
(fetch data  (uses data from JSON) 
from the database) 

이 구조를 갖는, 당신은 renderer = new JsonRenderer(DbData(dbParams)) 또는 renderer = new JsonRenderer(JsonData(data))을 할 수 있습니다.

+0

예, 이것은 내가 한 일입니다. 별도의 JsonDataProvider 클래스를 만들고 JsonRenderer의 생성자에서 제공된 dbParams 또는 JSON 데이터에 따라 사용할 dataProvider를 선택합니다. – vich