关于我的程序和多态性的问题

时间:2013-10-22 21:38:10

标签: java polymorphism

好的,基本上我正在创建一个程序,允许用户选择一个形状(三角形,正方形,圆形)然后它接受一个int并计算边界长度和面积。

我这样做没有问题,并且有一个完美的程序。 (https://gist.github.com/anonymous/c63a03c129560a7b7434 4个类)但是现在我必须用多态概念来实现它,而且我老老实实地在努力解决这个问题。

我基本了解了在继承方面我想做什么

                                       Main
                                         |
                                       Shapes
                                       /  |  \
                                triangle circle square

但我不明白当三角形/方形/圆形类中的所有方法都是唯一的时候我应该如何覆盖,没有“抽象”方法可以继承“Shapes”类

如果有人能够快速查看我链接的代码并提出一种方法来做到这一点,那将非常感激。

对不起,如果我不好解释这个。感谢。

4 个答案:

答案 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可以在三个类之间共享,而drawresize可以由每个类单独实现。

关于abstract classes的好处是你可以在它们甚至字段中实现方法。接口无法做到这一点。