你如何管理这个继承问题?

时间:2010-11-05 10:57:00

标签: actionscript-3 inheritance

让我们假设您有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的方法。我该怎么办?

    每次我想调用DrawingToolBar的方法时,
  • 施放它?
  • 在DrawingTool中创建一个成员(例如var drawingToolBar:DrawingToolBar),实例化它然后make toolBar = drawingToolBar?

第一个似乎笨重,我甚至不知道它是否会起作用。第二个似乎更好,但感觉有点“错误”。

还有其他方法吗?或者我在这里误用了继承?

1 个答案:

答案 0 :(得分:4)

您可能在工具栏中混合了太多功能。如果你认为MVC,你就错过了一个模型。

更准确地说,颜色选择器不应该是工具栏的属性。颜色选择器是您工具的属性。每个绘图工具都应该是独立的,并有自己的颜色选择器。如果所有绘图工具需要共享相同的颜色,则需要所有绘图工具共享的绘图模型。

我还会在另一个方向上更改工具栏及其工具之间的关系。工具栏中有工具,但工具本身应该是自包含的,并且没有对其包含工具栏的引用。

Java / Swing模型在工具栏的工作方式上非常简洁。你可以从中获得灵感:http://download.oracle.com/javase/tutorial/uiswing/components/toolbar.html