【问题标题】:Using Inheritance like this is right?像这样使用继承是对的吗?
【发布时间】:2020-01-20 00:52:45
【问题描述】:

我正在学习 Java 中的继承。

我正在制作一个程序(比特币挖矿游戏)。在程序中,有不同种类的挖掘机(Mining Machine):

  • 普通挖掘机(这只挖硬币),

  • 超频挖机(这个可以挖而且可以超频挖得更快)和

  • 耐久恢复挖掘机(这个可以挖掘、超频和恢复耐久度(每个挖掘机都有耐久度,挖掘时耐久度下降)。

我做了这个类图(有一些属性和方法我没有在图片中描述。我认为我的问题不需要这些。):

我不确定我是否做对了,尤其是使用 if 继承。

我应该只创建一个这样的类,而不是使用继承吗?因为只有一个函数添加到类中:

【问题讨论】:

  • 嗨,欢迎来到 StackOverflow!请edit您的问题以澄清您的具体问题或添加其他详细信息以准确突出您的需求。

标签: java inheritance uml class-diagram class-design


【解决方案1】:

这可能是装饰器模式的一个很好的候选者,它允许您在运行时将自定义功能应用于单个对象。可以在Decorator Pattern Wikipedia 页面上找到一个很好的参考,其中包括一个窗口系统的详细示例,以及一个供参考的 UML 类图。一段代码的 sn-p 显示了装饰器和具体的装饰器:

// 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,具体的装饰器可以被称为OverclockDecoratorRecoverDurabilityDecorator

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

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

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

【讨论】:

  • 感谢您的回答。我没学过抽象课。所以我想我只是使用图表的第一张图片。
  • 我想知道如果我使用第一个,我是否使用继承错误?
  • 对装饰器模式有疑问。如果我使用这种模式,就会有类挖掘机类,简单的挖掘机类。以及挖掘机装饰类、超频挖掘机类和耐用挖掘机类。对吗?
  • Digger 将是一个接口,其他将是类,而 DiggerDecorator 是一个抽象类。
  • 要回答您是否错误地使用了继承的问题,看起来DurabilityRecover 类不一定需要是OverclockDigger 的子类,这并不坚持单一职责原则。在我看来,这可以通过混合功能来克服。这有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多