Как вы справляетесь с этой проблемой наследования? - PullRequest
0 голосов
/ 05 ноября 2010

Допустим, у вас есть 2 класса ToolBar и DrawingToolBar. Панель инструментов должна служить базовым классом для различных других панелей инструментов, для различных инструментов. Панель инструментов обрабатывает такие базовые элементы панели инструментов, как открытие, закрытие, перетаскивание, удаление и т. Д. DrawingToolBar добавляет функциональность, специфичную для конкретного инструмента - кнопки, специфичные для инструмента и т. Д.

public class ToolBar extends Sprite {
    public var closeBtn:Sprite

    public function ToolBar():void {
        addChild(closeBtn)
        closeBtn.addEventListener(MouseEvent.CLICK, closeBtn_onClick)
    }

    protected function closeBtn_onClick(e:Event):void {
        close()
    }

    public function open():void {
        // blah
    }

    public function close():void {
        // blah
    }
}

и

public class DrawingToolBar extends ToolBar{

    public var penBtn: Sprite
    public var paintbrushBtn: Sprite
    public var colorPicker: ColorPicker

    public function DrawingToolBar():void {
        super()     
    }

    public function getColour():int {
        return colorPicker.color;
    }
}

Теперь у нас есть еще 2 класса - Tool и DrawingTool. Опять же, Tool является базовым классом для различных инструментов (включая DrawingTool). Если я сделаю элемент ToolBar в Tool (типизированный как ToolBar), мы можем делегировать общие задачи, например. Когда инструмент активирован, он добавляет панель инструментов на сцену и т. д. DrawingTool может создавать экземпляр ToolBar как DrawingToolBar, поэтому используется правильный библиотечный актив (но экземпляр все еще печатается как ToolBar).

public class Tool {
    public var toolBar:ToolBar

    public function Tool():void {
        initToolBar()       
    }

    protected function initToolBar():void {

        addChild(toolBar)

    }   
}

и

public class DrawingTool extends Tool {
    public function DrawingTool():void {
        super()     
    }

    override protected function initToolBar():void {
        toolbar = new DrawingToolBar() // this is probably very naughty 
        super.initToolBar()
    }

    public function getColor():int {

        return toolBar.getColor() // this fails because toolBar is type as ToolBar not DrawingToolBar
    }
}

Проблема возникает, когда в DrawingTool я хочу вызвать метод DrawingToolBar. Поскольку панель инструментов имеет тип ToolBar, я не могу вызвать методы DrawingToolBar для нее. Что мне делать?

  • разыгрывать его каждый раз, когда я хочу вызвать метод DrawingToolBar?
  • создать элемент в DrawingTool (например, var drawingToolBar: DrawingToolBar), создать его экземпляр и затем создать toolBar = drawingToolBar?

Первое кажется неуклюжим, я даже не знаю, сработает ли это. Второе кажется лучше, но кажется немного «неправильным».

Есть ли другой способ? Или я здесь неправильно использую наследование?

1 Ответ

4 голосов
/ 05 ноября 2010

Вы, вероятно, смешиваете слишком много функций в своей панели инструментов. Если вы думаете MVC, вам не хватает модели.

Точнее, палитра цветов не должна быть собственностью вашей панели инструментов. Выбор цвета является собственностью вашего инструмента. Каждый инструмент рисования должен быть автономным и иметь свой собственный палитру цветов. Если все инструменты рисования должны использовать один и тот же цвет, вам понадобится модель рисования, которая используется всеми инструментами рисования.

Я бы также изменил отношение между панелью инструментов и ее инструментами в другом направлении. На панели инструментов есть инструменты, но сами инструменты должны быть автономными и не иметь ссылки на содержащую их панель инструментов.

Модель Java / Swing очень чиста в том, как она работает с панелями инструментов. Вы можете получить от этого вдохновение: http://download.oracle.com/javase/tutorial/uiswing/components/toolbar.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...