2009-09-19 3 views
0

현재 내 위젯 엔진에 추가 할 목록 위젯을 디자인하고 있습니다. 모든 요소 시각적 인 측면이 코드 바깥에서 정의되기 때문에 대부분의 코드 기반을 재사용 할 수 있습니다. 예를 들어 탭 버튼은 실제로는 확인란입니다. 새 템플릿은 설계 응용 프로그램에 적어도 뷰어가 있어야하기 때문에 구현하는 데 시간이 걸립니다.목록 항목 및 클래스 디자인에 대한 의견

이미 확인란을 구현했습니다. 그것은 2 개의 상태 (체크/체크되지 않음)와 5 개의 하위 상태 (normal, hover/active, mousedown, disabled 및 state transition)를가집니다. 체크 박스 템플릿에는 텍스트 속성, 아이콘 (선택 사항) 및 테두리 (크기 재조정 가능)가 있습니다. 상태 및 substate 전환도 있습니다. 아이콘과 테두리 둘 다 애니메이션 가능합니다.

내 관심사는 목록 항목에 관한 것입니다. 그들은 체크 박스와 매우 유사합니다. 그러므로, 나는 listitem을 위해 checkbox template을 사용할 계획이다. 그러나 목록 항목에는 아이콘이있는 단순한 (텍스트 만) 체크 박스와 라디오 버튼 (라디오 버튼은 체크 박스와 IRadioButton 인터페이스에서 파생 됨)의 네 가지 모드가 필요합니다. 여기에 그 구조 :

IWidgetObject 
     | 
    Checkbox  IRadioButton 
     \    /
     `--------------´ 
       | 
     RadioButton 

나는 이와 같은 것을 구현하고 싶다. ListItemBase는 IWidgetObject에서 파생되어야합니다. 그것은 논리적인가 아니면 더 좋은 대안인가?

class ListItemBase : public Checkbox { 
     void Select() { do something; Checkbox::check(); } 
    } 

    //This listitem type will have a checkbox without any text 
    class ListItemCheckbox : public ListItemBase, private Checkbox { 
     check() { update parents checked list; Checkbox::check(); } 
    } 

    class ListItemRadio : public ListItemBase, private RadioButton, public IRadioButton { 
     //here is the problem 
    } 

ListItemRadio 또한 내가 (이름을 변경하기 위해) ListItemBase의 체크() 함수를 숨기려면,이 별개의 체크 박스 기능을 사용할 수 있습니다. 그런 다음이 방식으로 구현해야합니까?

class ListItemBase : private Checkbox, public IWidgetObject { 
     void Select() { do something; Checkbox::check(); } 

     //does this even works? (layer is a variable) 
     using Checkbox::layer; 
    } 

    //This listitem type will have a checkbox without any text 
    class ListItemCheckbox : public ListItemBase, private Checkbox { 
     check() { update parents checked list; Checkbox::check(); } 
    } 

    class ListItemRadio : public ListItemBase, private RadioButton, public IRadioButton { 
     //here is the problem 
    } 

하지만 이번에 나는 일반적인 기능을 구현 극복해야 ListItemRadio 2 IWidgetObjects을 보유하고 있습니다. 그러나 ListItemBase는 IWidgetObject의 모든 것을 Checkbox에 매핑해야합니다.

자매 클래스에 위임하는 것처럼 가상 상속을 사용하여 이러한 문제를 해결할 수 있습니까 (확인란). IWidgetObject가 인터페이스처럼 보일지라도 몇 가지 공통된 구현을 수년 동안 보았지만 문제가 하나 더 있습니다.하지만 문제는 없을 것입니다.

또 하나의 문제가 있습니다. Checkbox 클래스는 간단한 생성자를 가지고 있습니다. 다음과 같이 작성할 수 있습니까?

ListItemBase(IWidgetContainer &container, CheckboxBP &blueprint) : 
     Checkbox(container, blueprint), IWidgetObject(this) { 
} 

이렇게하면 많은 문제가 해결됩니다. 어떤 생각이라도 환영합니다.

내가 생각

    IWidgetObject 
         | 
ICheckbox  CheckboxBase  IRadioButton 
    | \    /| \   / | 
    | `-------------´ | `---------´  | 
    |   |   |  |   | 
    | Checkbox   | RadioButton | 
    |      |     | 
    |    ListItemBase    | 
    \    |  |    /
    `---------------´  `--------------´ 
      |      | 
    ListItemCheckbox  ListItemRadioButton 

당신은 어떻게 생각을 마련, 심지어 모든

답변

0

확인을 읽어 주셔서 감사?

2

"위젯 엔진"과 "템플릿"에 대한 세부 사항을 모르므로 손을 강제로 움직이는 방식으로 설계했습니다. 자연스러운 디자인이 대신 봉쇄와 구성을 사용하는 상속을 사용하는 것이 훨씬 바람직한 해결책입니다. 즉, 목록 항목 "IS-A"체크 박스를 말하는 반면, 자연 상태는 목록 항목 "HAS-A"체크 상자 (라디오 버튼과 유사)입니다.

위젯 엔진의 디자인으로 이러한 방식으로 작동하게되면 다중 상속의 필요성을 느끼게되는 것은 당연한 일입니다.하지만 그로 인해 여러 가지 복잡한 문제가 발생할 수 있습니다. 서브 클래 싱은 강한 커플 링 및 낮은 유연성으로 이어지는 반면, 봉쇄 및 구성은 이러한 측면에서 더 우수합니다. 이 문제를 아주 잘 설명하는 고전 Design Patterns을 읽는 것이 좋습니다. 그러나 이것은 확인란 것을 의미하지는 않습니다

ListItemBase(IWidgetContainer &container, CheckboxBP &blueprint) : 
     Checkbox(container, blueprint), IWidgetObject(this) { 
} 

을 : 당신이 디자인의이 종류에 갇힌 경우 쓰기, 말하기로

어쨌든, 다음, 네, 가능하다 기본 클래스 생성자는 IWidgetObject보다 먼저 실행됩니다. 기본을 선언 한 순서에 따라 다릅니다. IWidgetObject를 첫 번째 기준으로 선언하면 생성자가 다른 기준보다 먼저 실행됩니다.

+0

실제적으로 is-a 관계 (포함될 수있는 IWidgetObject가 될 것을 제외하고)에는 아무런 힘이 없습니다. 그러나 나는 그렇게하는 것을 선호합니다. 그러한 선호도에 관계없이, 말하듯이, 그 디자인을 유지하는 것은 너무 복잡합니다. –

관련 문제