【问题标题】:How to cube a squared answer using Java inheritance如何使用 Java 继承求平方答案
【发布时间】:2021-08-19 06:13:07
【问题描述】:

我们编程活动的方向是这样的(大致翻译成英文):

方向:编写一个程序,计算用户输入数字的平方和立方。创建显示 Java 的继承和封装特性的类。创建您自己的声明。

到目前为止,我已经完成了平方数。这是我的代码:

import java.util.*;

public class Square {

    protected int square;
    
    public int getSquare() {
        return square;
    }

    public void setSquare (int numberToSquare) {
        square = numberToSquare*numberToSquare;
    }  

    
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Square number2 = new Square();
        Cube number3 = new Cube();
        
        System.out.println("Enter number to square and cube: ");
        int userNumber = input.nextInt();
        
        number2.setSquare(userNumber);
        number3.setCube(userNumber);
        
        System.out.println("The square of " + userNumber + " is " + number2.getSquare());
        System.out.println("The cube of " + userNumber + " is " + number3.getCube());
    }
    
}

这是我的 Cube 类:

class Cube extends Square {
    protected int cube;
    
    public int getCube() {
        return cube;
    }
    
    public void setCube (int numberToCube){
        cube = getSquare()*numberToCube;
    }

}

我知道我的 setCube 错了,但这就是我想问的问题:我是否可以使用平方答案,这样我就可以避免键入 numberToCube x numberToCube x numberToCube? p>

【问题讨论】:

  • 这是一个奇怪的分配,但很可能您应该使用构造函数将基数 (userNumber) 保存在基类中,并使用 getSquare()getCube() 方法。
  • 回答你的问题,你试过了吗?
  • @ScaryWombat 是的,我尝试运行它,平方输出没问题,但立方体答案只输出“___ 的立方体为 0”
  • 我想你只需要调用 number3.setSquare(userNumber)
  • Cube.setCube() 需要在乘法前调用super.setSquare(numberToCube)。但我认为您被要求提供一个在Cube 中覆盖的int getResult() 方法。而且我也不会有那些setXXX() 方法:我会在构造函数中提供值并在那里或getValue() 方法中计算值。

标签: java oop inheritance encapsulation


【解决方案1】:

您可以创建您的类,如下所示。 (装饰器设计模式)

public interface Operation {
   public int getResult(int input);
}

public class Square implements Operation{

    public int getResult(int input) {
        return input*input;
    }
}

class Cube implements Operation {
    private Operation operation;

    public Cube(Operation operation){
        this.operation = operation;
    }

    public int getResult(int input) {
        return operation.getResult(input) * input;
    }

}

然后在上面调用:

Operation square= new Square();
Cube cube= new Cube(square);
cube.getResult(input);

【讨论】:

    【解决方案2】:

    或者更简单一点:

    public class Square {
    
        // Value is protected, so you can also see it in the Cube class.
        protected int val;
    
        public Square(int val) {
            this.val = val;
        }
    
        public int calculate() {
            return val*val;
        }
    }
    
    public class Cube extends Square {
    
        public Cube(int val) {
            super(val);
        }
    
        @Override
        public int calculate() {
            super.calculate()*val;
        }
    }
    

    无论哪种方式,我认为这是对面向对象编程和继承的误解,因为您使用两个类进行一些非常基本的计算。这些不是任何对象,它们以应该使用 OOP 的方式共享属性。

    【讨论】:

    • 我调整了您的代码以适合我的代码,并且成功了!太感谢了!是的,我一定会告诉我的老师。老实说,我对 Java 中的 OOP 概念感到迷茫,因为他很少深入解释它们。你知道任何可以帮助我的书籍或网站吗?
    • hmm...如果你懂德语,那么我可以推荐“Java ist auch nur eine Insel”。我不知道一本好的英文书。
    猜你喜欢
    • 1970-01-01
    • 2013-06-18
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多