当前位置: 首页 > 知识库问答 >
问题:

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

林英武
2023-03-14

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

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

我想通过颜色更改来触发所有工具的setColor()方法,因此我考虑将setColor()方法作为静态方法放在工具类中,但这不允许我在橡皮擦类中重写以防止颜色更改。

有人对如何实现这个有什么想法吗?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
    }

}

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

铅笔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);
    }

共有1个答案

微生弘
2023-03-14

我建议添加一个新的抽象类ColorableTool扩展Tool,它存储方法setColor
Eraser将扩展Tool,而Brush铅笔将扩展ColorableTool
如果您的项目更多地进入多态性,您应该检查接口是否有此类行为(Java)!:)

您可以像这样使用instanceof检查当前工具是否为可着色工具

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

当你想更新每种颜色时,我建议使用静态绘制,这是工具之间共享的绘制实例(如果你实现了我的解决方案,也可以使用可着色工具)。它应该看起来像

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

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

 类似资料:
  • 我在想有没有更好的办法。我想要的是在抽象类中有一个具体的方法,返回扩展抽象类的具体实例。 我认为我不应该把它转换成T,因为它总是T的一个实例。

  • 问题内容: Java 8接口默认方法与抽象类中的非抽象方法-两者之间是否有任何区别(除了iface-类,可见性等不同) 默认方法不是Java的后退一步,是否违反Java多年来宣传的本质? 问题答案: 如果抽象子类的具体子类被super()覆盖,则抽象类中的非抽象方法将被调用。因此,存在多种可能性。如果不重写method,则将执行超类方法。如果我们在具体的子类方法中使用super(),则将执行被超类

  • Java 8接口默认方法与抽象类中的非抽象方法--两者之间有什么区别吗(除了iface-class、可见性等的区别之外) 默认方法是不是在Java中倒退了一步,意味着它违背了Java多年来宣传的本质?!

  • 当我宣布“抽象公共无效显示();”在抽象类测试中,这是创建一个全新的show()方法,还是只引用Inter接口中声明的show()方法?请澄清。

  • 我有一个子类,它声明了我的抽象超类中的所有方法,但它仍然给我一个错误,说明我的类不是抽象的。我不知道为什么会抛出这个错误。 我得到的具体错误是 PhoneBookEntry.java: 1:错误:PhoneBookEntry不是抽象的,并且不会覆盖可比中的抽象方法compareTo(Object) 我的问题代码: 还有我的子类:

  • 我有这样的抽象类: 我还有一个扩展抽象的类: