好的,基本上我正在创建一个程序,允许用户选择一个形状(三角形,正方形,圆形)然后它接受一个int并计算边界长度和面积。
我这样做没有问题,并且有一个完美的程序。 (https://gist.github.com/anonymous/c63a03c129560a7b7434 4个类)但是现在我必须用多态概念来实现它,而且我老老实实地在努力解决这个问题。
我基本了解了在继承方面我想做什么
Main
|
Shapes
/ | \
triangle circle square
但我不明白当三角形/方形/圆形类中的所有方法都是唯一的时候我应该如何覆盖,没有“抽象”方法可以继承“Shapes”类
如果有人能够快速查看我链接的代码并提出一种方法来做到这一点,那将非常感激。
对不起,如果我不好解释这个。感谢。
答案 0 :(得分:1)
我注意到你的形状对象之间没有通用的接口。
你可以这样做:
public interface Shape {
// whatever polymorphic behavior you want
}
然后你的每个类都会这样声明:
public class Circle implements Shape {
// ...
}
public class Triangle implements Shape {
// ...
}
public class Square implements Shape {
// ...
}
等
答案 1 :(得分:1)
也许这可以是一个开始:
public abstract class Shape {
protected double length;
public Shape(double length) {
this.length = length;
}
public abstract double getArea();
public abstract double getBoundaryLength();
}
一种可能的实施方式
public class Circle extends Shape {
@Override
public double getArea() {
return length * length * Math.PI;
}
@Override
public double getBoundaryLength() {
return 2 * length * Math.PI;
}
}
在main中:
Shape shape = new Circle(scan.nextDouble()); // Use variable of type shape here
..
// this code is the same for all shapes
double boundaryLength = shape.getBoundaryLength(length);
double area = shape.getArea(length);
System.out.println("Boundary Length = " + Math.round(boundaryLength));
System.out.println("Area = " + Math.round(area));
答案 2 :(得分:1)
这里的想法是将所有子类中出现的方法作为Shape中的抽象方法。如果这样做,您可以将Shape对象作为Shapes使用,而无需知道它们是哪种形状。例如,你这样做:
Shape c = new Circle(50);
System.out.println(c.getArea());
这将导致打印正确的形状区域(由圆圈计算),同时仍然将其用作形状(第二行对其创建为圆形的起源一无所知,但仍将计算为一个)。这只能通过使用继承来实现。
答案 3 :(得分:1)
正如@KepaniHaole所提到的,你可以创建一个接口并使你的类实现它。
另一种方法是创建一个abstract class
,在其中实现三个类之间通用的方法,并保留对它们自己的类不常见的方法的实现。
例如:
public abstract class Shape
{
int x, y;
void moveTo(int newX, int newY)
{
//implementation
}
abstract void draw();
abstract void resize();
}
因此moveTo
可以在三个类之间共享,而draw
和resize
可以由每个类单独实现。
关于abstract classes
的好处是你可以在它们甚至字段中实现方法。接口无法做到这一点。