【问题标题】:Different Method Behavior in Child Class from Abstract Parent Class子类与抽象父类的不同方法行为
【发布时间】:2022-07-20 23:03:28
【问题描述】:

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

我正在从其他地方收到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);
}

Tool.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);
}

Eraser.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
    }

}

Brush.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);
    }

Pencil.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);
    }

【问题讨论】:

    标签: java


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多