2011-08-19 5 views
4

가설적인 질문 : 제가 복합 서브 클래스가 사용자 정의 화합물 위젯을하려면이 SWT 디자인 결정에 대해SWT 사용자 제어 설계 결정

? 정말 현명한거야?

SWT에 WinForm 등의 UserControl 클래스가 있다면 더 좋지 않습니까?

Composite를 하위 클래스로 만들 때 내 맞춤 위젯은 클라이언트가 Composite로 사용할 의도가 없더라도 Composite 인터페이스를 가져옵니다. 그것은 나쁘다. Spinner와 같은 일부 SWT 위젯에서도 마찬가지입니다.

좋은 방법이 있습니까?

그리고 가장 흥미로운 사실 ​​:이 디자인 결정에 대한 동기를 아는 사람이 있습니까?

+0

상속 대신 위임을 사용할 수 있습니까? –

+0

이것은 위임을 어떤 식 으로든 사용하는 것이 더 깔끔하고, Control을 확장하고 내부 Composite를 가질 것이라고 생각했습니다. 그러나 SWT 지침에서는 Composite 또는 Canvas 만 확장해야한다고 말합니다. 캔버스는 어느 쪽이든 좋아 보이지 않는다. – Lii

+0

스윙에서 많은 개발을하고 있기 때문에 인터페이스가 너무 부피가 크고 조롱을하기 때문에 사용하는 모든 스윙 구성 요소를 래핑했습니다. –

답변

1

당신은 당신의 자신의 NonCompositeUserControl 클래스를 만들 수 있습니다 CComboComposite에서 확장으로 어떻게이 문제와 SWT 상품의 내부적,

public class NonCompositeUserControl extends Composite { 
    @Override 
    public void setLayout(Layout layout) { 
     throw new UnsupportedOperationException("This control is not really a composite") 
    } 
    // similarly for other methods 
} 
+0

예, 이와 같이 런타임 검사를 추가 할 수 있습니다. 그러나 Composite를 전혀 하위 클래스화할 필요가 없다면 오류가 발생하기 쉽고 명확 해집니다. 예를 들어 다른 위젯을 만들 때이 클래스를 부모로 전달할 수 있습니다. – Lii

2

당신은 org.eclipse.swt.custom.CCombo에 대한 소스 코드를 볼 수 있습니다 볼 수 있습니다. 을 처리하는 방법은 다음과 같습니다.

/** 
* Sets the layout which is associated with the receiver to be 
* the argument which may be null. 
* <p> 
* Note: No Layout can be set on this Control because it already 
* manages the size and position of its children. 
* </p> 
* 
* @param layout the receiver's new layout or null 
* 
* @exception SWTException <ul> 
* <li>ERROR_WIDGET_DISPOSED - if the receiver has been disposed</li> 
* <li>ERROR_THREAD_INVALID_ACCESS - if not called from the thread that created the receiver</li> 
* </ul> 
*/ 
public void setLayout (Layout layout) { 
    checkWidget(); 
    return; 
} 
+0

누군가가이 메소드를 호출 할 때 그들은 심지어 던지지 않습니다. 당신은 당신이 뭔가 잘못했다고 알지도 못합니다. – Lii

+0

그리고이 점이 나에게 의심스런 디자인 인 것 같다. Composite로 작동하지 않을 위젯에서 Composite 인터페이스를 공개적으로 상속 받기 때문입니다. 그러나 어쩌면 좋은 이유가있을 수 있습니다. 그것이 무엇인지 아는 것이 재미있을 것입니다. – Lii

관련 문제