我正在做一个绘图项目,我有一些工具(例如画笔、橡皮擦等),它们都是自己的类,每个都继承自一个抽象工具类,具有一些基本属性和抽象/非抽象方法。我看到的主要问题是,当我需要更改这些工具的颜色时,我想找出一种方法来为所有工具更改颜色,但也允许某些工具(如橡皮擦)保持不变,因为它的颜色应该始终只是背景色。
我正在从其他地方接收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);
}
我建议添加一个新的抽象类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) 我的问题代码: 还有我的子类:
我有这样的抽象类: 我还有一个扩展抽象的类: