2010-07-14 2 views
0

Я использую gwt framework под названием smartgwt (однако проблема касается gwt и java). Там вы можете найти класс HLayout, который может содержать членов. Вы можете добавить их, используя:Проблема с предоставлением методов

addMember(Canvas component) 

Я создал класс RectConainer, который расширяет класс HLayout. Затем я создал еще один класс Rect, который косвенно расширяет класс Canvas. Прямо сейчас, я хочу RectConainer обеспечить:

addMember(Rect component) 

вместо:

addMember(Canvas component) 

Другими словами, я хочу RectConainer предоставить все унаследованный метод + addMember (компонент Rect), но без addMember (Canvas компонент). Единственный способ сделать это (я знаю) - использовать класс Composite, но затем я блокирую все унаследованные методы. Поскольку у меня их много, тогда мне придется написать много строк кода, чтобы предоставить их снова. Итак, есть ли у вас какие-нибудь идеи, как решить эту проблему?

Заранее спасибо

ответ

0

Если я вас правильно понимаю, у вас есть общественный addMember (Canvas компонент) метод в классе HLayout, и вы хотите, чтобы «скрыть» его в RectConainer (Обеспечивая компонент addMember (Rect) вместо этого) , Короткий ответ: «Нельзя скрыть addMember (компонент холста)», потому что он будет тормозить polymorphism, т. Е. Ваш дочерний класс (RectConainer) не сможет предоставить контракт (интерфейс) вашего родительского класса (HLayout).

Что вы можете сделать (я не могу думать о какой-либо уважительной причины, чтобы сделать это, но все же) заключается в следующем:

@Override 
public void addMember(Canvas component) { 
    throw new UnsupportedOperationException("Do not call this method. Call addMember(Rect component) instead"); 
} 

Но опять же, подумайте дважды, прежде чем делать это: этот метод является частью какого-либо контракта что ваши рамки могут рассчитывать. Если вы хотите ограничить Canvas, который вы можете передать вашему методу addMember, просто выполните проверку типа:

@Override 
public void addMember(Canvas component) { 
    if (!Rect.class.isInstance(component)) { 
     throw new IlligalArgumentException("Only Rect is accepted. Sorry..."); 
    } 
} 
+0

Спасибо за ответ, теперь я вижу проблему с полиморфизмом – peter

Смежные вопросы