繁体   English   中英

子类中与抽象父类的不同方法行为

[英]Different method behavior in child class from abstract parent class

我正在做一个绘图项目,并且我有某些工具(即画笔、橡皮擦等)是它们自己的类,每个工具都继承自具有一些基本属性和抽象/非抽象方法的抽象工具类. 我看到的主要问题是当我需要更改这些工具的颜色时,我想找出一种方法来为所有工具做到这一点,但也允许某些工具(如橡皮擦)保持不变,因为它的颜色应该始终只是背景颜色。

我从其他地方收到onColorChange(int newColor)方法调用,但这是我触发工具颜色更改的起点。 现在,它只更改活动工具的颜色,但这意味着每个工具都有不同的颜色集,这会让人感到困惑。

我想要颜色更改来触发所有工具的setColor()方法,所以我考虑将 setColor() 方法作为静态方法放在 Tool 类中,但这不允许我在 Eraser 类中覆盖以防止颜色被改变。

有人对如何实现这个有任何想法吗? TLDR:我希望 onColorChange() 事件触发所有工具的颜色更改,但我也想在 Eraser 类中覆盖它,因此该工具不会发生颜色更改。

目前,通过我的实施,我有以下内容:

Tool currentTool;
Tool myBrush;
Tool myEraser;
Tool myPencil;

// This is called from elsewhere
pubic void setup() {
   myBrush = new Brush();
   myEraser = new Eraser();
   myPencil = new Pencil();
   currentTool = myBrush;
}

// This is called from elsewhere
public void onColorChange(int newColor) {
   currentTool.setColor(newColor);
}

工具.java

public abstract class Tool {

    protected String toolName;

    protected Paint myPaint;

    public String getToolName() {
        return mToolName;
    }

    public int getColor() {
        return myPaint.getColor();
    }

    public Paint getPaintObject() {
        return myPaint;
    }

    protected abstract void setColor(int newColor);
}

橡皮擦.java

public class Eraser extends Tool {


    public Eraser() {
        toolName = "ERASER";


        myPaint = new Paint();
        mFgPaint.setColor(Color.parseColor("#FFFFFF"));
        mFgPaint.setAntiAlias(true);
        mFgPaint.setStrokeWidth(DEFAULT_WIDTH);
        mFgPaint.setStyle(Paint.Style.STROKE);
        mFgPaint.setStrokeJoin(Paint.Join.ROUND);
        mFgPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void setColor(int newColor) {
        // Empty, since I cannot change the paint color of the eraser
    }

}

刷机.java

public class Brush extends Tool {

   
    public Brush() {
        toolName = "BRUSH";
        myPaint = new Paint();
        setColor(Color.parseColor("#000000"));
        mFgPaint.setAntiAlias(true);
        mFgPaint.setStrokeWidth(DEFAULT_WIDTH);
        mFgPaint.setStyle(Paint.Style.STROKE);
        mFgPaint.setStrokeJoin(Paint.Join.ROUND);
        mFgPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void setColor(int newColor) {
        myPaint.setColor(newColor);
    }

铅笔.java

public class Pencil extends Tool {

   
    public Brush() {
        toolName = "PENCIL";
        myPaint = new Paint();
        setColor(Color.parseColor("#000000"));
        mFgPaint.setAntiAlias(true);
        mFgPaint.setStrokeWidth(DEFAULT_WIDTH);
        mFgPaint.setStyle(Paint.Style.STROKE);
        mFgPaint.setStrokeJoin(Paint.Join.ROUND);
        mFgPaint.setStrokeCap(Paint.Cap.ROUND);
    }

    @Override
    protected void setColor(int newColor) {
        myPaint.setColor(newColor);
    }

我建议添加一个新的抽象类ColorableTool扩展Tool存储方法setColor
Eraser将扩展Tool ,而BrushPencil将扩展ColorableTool
如果您的项目更多地涉及多态性,您应该检查接口是否存在这种行为(在 Java 中)! :)

编辑 1

您可能会使用这样的instanceof检查您当前的工具是ColorableTool

if(currentTool instanceof ColorableTool) {
  // Do Stuff
}

编辑 2

当您想更新每种颜色时,我建议使用static绘画,即在Tool之间共享的绘画实例(如果您实施了我的解决方案,则为ColorableTool )。 它应该看起来像

public abstract class Tool {

    protected String toolName;
    static final Paint myPaint = new Paint(); // A shared paint between tools

    public String getToolName() {
        return toolName;
    }

    public int getColor() {
        return myPaint.getColor();
    }

    public Paint getPaintObject() {
        return myPaint;
    }

    public static void setColor(int newColor) {
        Tool.myPaint.setColor(newColor);
    }
}

因此调用Tool.setColor将更新每个工具的颜色!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM