这样使用继承是正确的吗?

2020年7月25日 11点热度 0条评论

我正在学习Java继承。

我正在编写一个程序(比特币挖矿游戏)。

我做了一个关于Digger(矿机)的类图。

在程序中

有普通的挖掘机(只挖硬币),

超频挖掘器(这可以挖掘并且可以超频挖掘更快)和

耐用性恢复挖掘器(这可以挖掘,超频并恢复耐久性(每个挖掘器具有耐久性,挖掘时耐久性下降)。

(有一些我未在图片中描述的属性和方法。我认为我的问题不需要这些。)

我不确定我做对了。我希望获得有关继承的一些反馈。

或者代替使用继承。我应该上这样的课吗?

因为只有一个函数添加到类中。

感谢您的阅读!

解决方案如下:

这可能是Decorator Pattern的一个很好的选择,Decorator Pattern允许您在运行时将自定义功能应用于单个对象。可以在Decorator Pattern Wikipedia页面上找到对此的良好参考,该页面包括Windowing系统的详细示例,并带有UML类图作为参考。代码片段显示了装饰器和混凝土装饰器:

// abstract decorator class - note that it implements Window
abstract class WindowDecorator implements Window {
    private final Window windowToBeDecorated; // the Window being decorated

    public WindowDecorator (Window windowToBeDecorated) {
        this.windowToBeDecorated = windowToBeDecorated;
    }
    @Override
    public void draw() {
        windowToBeDecorated.draw(); //Delegation
    }
    @Override
    public String getDescription() {
        return windowToBeDecorated.getDescription(); //Delegation
    }
}

// The first concrete decorator which adds vertical scrollbar functionality
class VerticalScrollBarDecorator extends WindowDecorator {
    public VerticalScrollBarDecorator (Window windowToBeDecorated) {
        super(windowToBeDecorated);
    }

    @Override
    public void draw() {
        super.draw();
        drawVerticalScrollBar();
    }

    private void drawVerticalScrollBar() {
        // Draw the vertical scrollbar
    }

    @Override
    public String getDescription() {
        return super.getDescription() + ", including vertical scrollbars";
    }
}

在您的情况下,装饰器将被称为
DiggerDecorator,而具体的装饰器将被称为
OverclockDecorator
RecoverDurabilityDecorator

实例化一个完全装饰的对象的代码可能如下所示:

Digger decoratedDigger = new OverclockDecorator(new RecoverDurabilityDecorator(new SimpleDigger()));

如您所见,该解决方案仍然使用继承,但是可以根据需要“混合”单个功能。