Проблема с предоставлением методов - PullRequest
0 голосов
/ 14 июля 2010

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

addMember(Canvas component)

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

addMember(Rect component)

вместо:

addMember(Canvas component)

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

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

1 Ответ

0 голосов
/ 14 июля 2010

Если я вас правильно понимаю, у вас есть публичный метод addMember (компонент Canvas) в классе HLayout, и вы хотите «спрятать» его в своем RectConainer (предоставив addMember (компонент Rect) вместо). Краткий ответ: «Нельзя скрыть addMember (компонент Canvas)», потому что он будет тормозить полиморфизм , т. Е. Ваш дочерний класс (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...");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...