让我们假设您有2个类ToolBar和DrawingToolBar。 ToolBar将作为各种其他工具栏的基类,用于各种工具。 ToolBar处理基本的'toolbar-y'之类的东西,比如打开,关闭,拖放,拖放等.IndimalToolBar添加特定于特定工具的功能 - 特定于工具的按钮等。
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;
}
}
现在,我们还有另外两个类 - Tool和DrawingTool。同样,Tool是各种工具的基类(包括DrawingTool)。如果我在Tool中创建ToolBar成员(键入ToolBar),我们可以委派常见任务,例如。当工具启用时,它会将工具栏添加到舞台等.LargeTool可以将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的方法。我该怎么办?
第一个似乎笨重,我甚至不知道它是否会起作用。第二个似乎更好,但感觉有点“错误”。
还有其他方法吗?或者我在这里误用了继承?
答案 0 :(得分:4)
您可能在工具栏中混合了太多功能。如果你认为MVC,你就错过了一个模型。
更准确地说,颜色选择器不应该是工具栏的属性。颜色选择器是您工具的属性。每个绘图工具都应该是独立的,并有自己的颜色选择器。如果所有绘图工具需要共享相同的颜色,则需要所有绘图工具共享的绘图模型。
我还会在另一个方向上更改工具栏及其工具之间的关系。工具栏中有工具,但工具本身应该是自包含的,并且没有对其包含工具栏的引用。
Java / Swing模型在工具栏的工作方式上非常简洁。你可以从中获得灵感:http://download.oracle.com/javase/tutorial/uiswing/components/toolbar.html