Java 关于我的程序和多态性的问题
好的,基本上我正在创建一个程序,允许用户选择一个形状(三角形、正方形、圆形),然后输入一个int并计算边界长度和面积 我做这件事没有问题,我有一个工作完美的程序。(4个类)但现在我必须用多态性的概念来实现这一点,我真的很难做到这一点 在继承方面,我有一个基本的想法Java 关于我的程序和多态性的问题,java,polymorphism,Java,Polymorphism,好的,基本上我正在创建一个程序,允许用户选择一个形状(三角形、正方形、圆形),然后输入一个int并计算边界长度和面积 我做这件事没有问题,我有一个工作完美的程序。(4个类)但现在我必须用多态性的概念来实现这一点,我真的很难做到这一点 在继承方面,我有一个基本的想法 Main |
Main
|
Shapes
/ | \
triangle circle square
但我不明白当三角形/正方形/圆形类中的所有方法都是唯一的时,我应该如何重写,因为没有“抽象”方法可以从“Shapes”类继承
如果有人能快速查看我链接的代码并提出一种方法,我们将不胜感激
如果我不善于解释的话,我很抱歉。谢谢。我注意到图形对象之间没有公共接口 你可以这样做:
public interface Shape {
// whatever polymorphic behavior you want
}
public class Circle implements Shape {
// ...
}
public class Triangle implements Shape {
// ...
}
public class Square implements Shape {
// ...
}
然后你的每个类都会这样声明:
public interface Shape {
// whatever polymorphic behavior you want
}
public class Circle implements Shape {
// ...
}
public class Triangle implements Shape {
// ...
}
public class Square implements Shape {
// ...
}
等等。我注意到图形对象之间没有公共接口 你可以这样做:
public interface Shape {
// whatever polymorphic behavior you want
}
public class Circle implements Shape {
// ...
}
public class Triangle implements Shape {
// ...
}
public class Square implements Shape {
// ...
}
然后你的每个类都会这样声明:
public interface Shape {
// whatever polymorphic behavior you want
}
public class Circle implements Shape {
// ...
}
public class Triangle implements Shape {
// ...
}
public class Square implements Shape {
// ...
}
等等。也许这是一个开始:
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;
}
}
在主要区域内:
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));
也许这是一个开始:
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;
}
}
在主要区域内:
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));
这里的想法是让所有子类中出现的方法都以抽象方法的形式出现。如果这样做,则可以将形状对象作为形状使用,而不必知道它们是哪种形状。例如,您可以执行以下操作:
Shape c = new Circle(50);
System.out.println(c.getArea());
这将导致打印由圆计算的形状的正确区域,同时仍将其用作形状(第二行不知道其创建为圆的起源,但仍将计算为圆)。这只能通过使用继承来实现。这里的想法是让所有子类中出现的方法都以抽象方法的形式出现。如果这样做,则可以将形状对象作为形状使用,而不必知道它们是哪种形状。例如,您可以执行以下操作:
Shape c = new Circle(50);
System.out.println(c.getArea());
这将导致打印由圆计算的形状的正确区域,同时仍将其用作形状(第二行不知道其创建为圆的起源,但仍将计算为圆)。这只能通过使用继承来实现。正如@KepaniHaole所提到的,您可以创建一个接口并使您的类实现它。 另一种方法是创建一个
抽象类
,在它内部实现三个类之间通用的方法,并保留它们自己的类不通用的方法的实现
例如:
public abstract class Shape
{
int x, y;
void moveTo(int newX, int newY)
{
//implementation
}
abstract void draw();
abstract void resize();
}
因此,moveTo
可以在三个类之间共享,而draw
和resize
可以由每个类单独实现
抽象类
的好处在于,您可以在它们内部甚至字段中实现方法。这在接口中是不可能的。正如@KepaniHaole所提到的,您可以创建一个接口并使您的类实现它。
另一种方法是创建一个抽象类
,在它内部实现三个类之间通用的方法,并保留它们自己的类不通用的方法的实现
例如:
public abstract class Shape
{
int x, y;
void moveTo(int newX, int newY)
{
//implementation
}
abstract void draw();
abstract void resize();
}
因此,moveTo
可以在三个类之间共享,而draw
和resize
可以由每个类单独实现
抽象类
的好处在于,您可以在它们内部甚至字段中实现方法。这在接口中是不可能的。好吧,它们都共享一个类似的构造函数a(double)
。它们都有共同的方法:getArea(double)&getBoundaryLength(double)
。如果将所有这些作为抽象方法和必需的构造函数放入抽象类中,它应该可以工作。getArea和getBoundaryLength肯定可以抽象。记住,抽象意味着“在两个不同的事物中找到共同点”,你到底想要什么?您是否试图访问派生类中特定派生类所特有的方法?嗯,它们都共享一个类似的构造函数a(double)
。它们都有共同的方法:getArea(double)&getBoundaryLength(double)
。如果将所有这些作为抽象方法和必需的构造函数放入抽象类中,它应该可以工作。getArea和getBoundaryLength肯定可以抽象。记住,抽象意味着“在两个不同的事物中找到共同点”,你到底想要什么?您是否试图访问派生类中特定派生类所特有的方法?我想我会这样做,我非常感谢您的帮助。如果这有道理的话,我想我自己的想法被搞糊涂了。谢谢:)我想我会这样做的,我真的很感谢你的帮助。如果这有道理的话,我想我自己的想法被搞糊涂了。谢谢:)非常感谢,但我想我会同意米莎的回答。谢谢你花时间帮我。非常感谢你,但我想我会同意米莎的回答。谢谢你抽出时间来帮我。