현재 내 위젯 엔진에 추가 할 목록 위젯을 디자인하고 있습니다. 모든 요소 시각적 인 측면이 코드 바깥에서 정의되기 때문에 대부분의 코드 기반을 재사용 할 수 있습니다. 예를 들어 탭 버튼은 실제로는 확인란입니다. 새 템플릿은 설계 응용 프로그램에 적어도 뷰어가 있어야하기 때문에 구현하는 데 시간이 걸립니다.목록 항목 및 클래스 디자인에 대한 의견
이미 확인란을 구현했습니다. 그것은 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
당신은 어떻게 생각을 마련, 심지어 모든
실제적으로 is-a 관계 (포함될 수있는 IWidgetObject가 될 것을 제외하고)에는 아무런 힘이 없습니다. 그러나 나는 그렇게하는 것을 선호합니다. 그러한 선호도에 관계없이, 말하듯이, 그 디자인을 유지하는 것은 너무 복잡합니다. –