Допустим, у вас есть 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?
Первое кажется неуклюжим, я даже не знаю, сработает ли это. Второе кажется лучше, но кажется немного «неправильным».
Есть ли другой способ? Или я здесь неправильно использую наследование?