如何设计几何图形类层次结构?

时间:2011-02-22 03:06:14

标签: java

  

此任务的主要目的是计算三维几何形状的体积和表面积   比如,圆筒,圆锥形。

     

使用Java语言

     

按以下方式设计课程:

     
      
  • 名为“GeometricShapes”的接口
  •   
  • 一个名为“ThreeDShapes”的抽象类
  •   
  • ThreeDShapes的两个子类:Cylinders和Cones。
  •   
  • 一个测试类名称为“TestShapes”
  •   
     

获取圆柱体和圆锥体的体积和表面积的输出以及相应的值   他们适当的输入变量。尝试使用toString()方法和数组。你的课应该是   使用面向对象编程所需的方法设计。

我到目前为止:

package Assignment2;  

    public interface GeometricShapes {

      public void render();
      public int[] getPosition();
      public void setPosition(int x, int y);

    }

   package Assignment2;

   public abstract class ThreeDShapes implements GeometricShapes
   {

      public int[] position;
      public int[] size;

      public ThreeDShapes()
      {

      }

      public int[] getPosition()
      {
         return position;
      }

      public void setPosition(int x, int y)
      {

         position[0] = x;
         position[1] = y;

      }

   }

   package Assignment2;

   public class Cylinders extends ThreeDShapes
   {

      public Cylinder()
      {
      }

      public void render()
      {
      }


   }

我不认为这是对的,我不知道如何解决它。 :(请帮忙。

3 个答案:

答案 0 :(得分:1)

解决问题的大部分任务是了解你的问题。老师想让你表明你知道接口,抽象类和类是如何连接的,以及你如何为整个对象实例做出贡献。

你假设的东西很少,但你会更好地重读为你提供的笔记 - 假设你在课堂上没有注意。我的经验表明,苦苦挣扎的学生确实需要更多的建议才能开始 - 如果你需要帮助,找一个能够上课的人并且只是寻求帮助。

但就目前而言,为了让你前进,这就是分配的一部分可能是什么样的

package Assignment2;

import java.util.Arrays;

public class task {
    public static interface GeometricShapes {
        public double getArea();
        public double getVolume();
    }

    public static abstract class ThreeDShapes implements GeometricShapes {
        protected double a, h;
    }

    public static class Cones extends ThreeDShapes {
        @Override public double getArea() {
            return Math.PI * this.a * Math.sqrt(a * a + h * h);
        }

        @Override public double getVolume() {
            return (1d / 3d) * Math.PI * Math.pow(a, 2) * a * h;
        }

        @Override public String toString() {
            StringBuilder builder = new StringBuilder();
            builder.append("Cone [a=").append(a).append("; ").append("h=")
                    .append(h).append(" ( area=").append(this.getArea())
                    .append("; volume=").append(this.getVolume()).append(" )]");
            return builder.toString();
        }
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(new ThreeDShapes[] { 
            new Cones() {{ a = 3; h = 4;}}, 
            new Cones() {{ a = 4; h = 5;}}
        }));
    }
}

输出:

[
  Cone [a=3.0; h=4.0 ( area=39.98594644342529; volume=113.09733552923255 )], 
  Cone [a=4.0; h=5.0 ( area=71.08612701053386; volume=335.1032163829112 )]
]

答案 1 :(得分:0)

提示#1 - 要求说明:“获取圆柱体和锥体的体积和表面积的输出......”。显然,您需要API方法来计算形状的体积和表面积,并且需要测试代码来构建样本3D形状,并调用计算体积的方法。

提示#2 - 请求说:“尝试使用toString()方法”。很明显,你需要在你的类上实现toString()。

提示#3 - reqs不讨论渲染形状,你不需要形状的位置来计算它的体积。

答案 2 :(得分:0)

所以,让我们看看你的错误信息,他们很清楚说出了什么问题。

task.java:25: task.Cones is not abstract and does not override abstract method getVolumeCylinder() in task.GeometricShapes
      public static class Cones extends ThreeDShapes 
                    ^
task.java:58: task.Cylinder is not abstract and does not override abstract method getVolumeCylinder() in task.GeometricShapes
      public static class Cylinder extends ThreeDShapes
                    ^

因此,您的界面GeometricShapes定义了方法getVolumeCylinder()。 (为什么?) 这意味着,实现此接口的每个(非抽象)类也需要具有此方法(如果不是某个超类已经实现了这个)。

为什么要将这些方法放在界面中?您的GeometricShapes界面代表什么?一组形状?单个形状(那么名称应该是单数,而不是复数)?

首先考虑一下,然后你会得到关于哪些方法在这里有用的答案,以及如何构建你的子类。

task.java:64: cannot find symbol
symbol  : variable cylinderBase
location: class task.Cylinder
            return cylinderBase * cylinderHeight;
                   ^

此错误消息(以及以下所有消息)提及未在任何地方声明的变量。想想你在哪里使用这些变量,以及它们属于什么对象。然后在这个对象中声明它们,并组织给它们正确的值。

task.java:126: cannot find symbol
symbol  : class Cylinders
location: class task
               new Cylinders() 
                   ^

最后一条消息抱怨,因为您正在尝试创建类Cylinders的对象,并且没有此类。 (但是你有一个名为Cylinder的类。)