OOP任务(类层次结构,继承,接口等)

时间:2014-01-05 04:13:28

标签: java oop inheritance interface class-hierarchy

由于我正在努力了解有关OOP(Java)的更多信息,因此我正在通过一些文献中找到这个“任务”。不幸的是,由于我对OOP很新,我没有任何样本解决方案。也许你们中的一些人可以给我一些意见,所以可以通过这个方式。


  1. 为这些类定义类层次结构:
    • 四边形
    • 凸四边形
    • 梯形
    • 平行四边形
    • 菱形
    • 矩形
  2. 尽可能创建每个类的实例
  3. 在每个班级中定义合理的属性和方法
  4. 重载和覆盖方法
  5. 为每个类编写合理的构造函数
  6. 以有意义的方式使用修饰符(abstract,static,final,public,protected和private)
  7. 如何将界面用于此任务?

  8. 01班级等级

    好的,这是简单的数学运算,您可以在各地找到关于四边形层次结构的大量信息。这是我做的:

    enter image description here


    创建每个类的对象没什么大不了的,但是我对理解所有OOP技术仍有一些问题。有些地方我不知道最好的方法是什么...(例如,继承自两个类的广场,在java中根本不可能)。此外,公式(如计算表面积)无论如何都会被覆盖(因为它们在大多数情况下是不同的),所以为什么我还需要继承呢?我不能只使用一个接口,在所有这些类中使用它,迫使他们实现这些公式吗?

    问候 - Vulpecula

3 个答案:

答案 0 :(得分:2)

在现实生活中,使用界面可能会更好。像这样的深层继承结构常常令人不悦;通常认为“更喜欢构图而不是继承”(http://en.wikipedia.org/wiki/Composition_over_inheritance)。例如,您可以使用“四边形”界面来定义“表面区域”和“周长”,然后让其他形状满足该界面。

如果这是一个家庭作业问题,那么您应该将课程层次结构基于您的教科书/教师之前提供的任何示例。这不是关于设计健壮的软件,而是关于向老师证明你学会了以他们认为应该做的任何方式做事。

答案 1 :(得分:1)

作为中等复杂层次结构基础的抽象类不如界面灵活。类 - 抽象与否 - 强制特定类型的实现。

不用太考虑,这是开始的一种方式:

public interface Quadrilateral  {
   int getTopMillimeters();
   int getLeftMillimeters();
   int getRightMillimeters();
   int getBottomMillimeters();
}

从这些原始数据中,您还可以定义

getTopLeftAngle(),getTopRightAngle(),...

将根据长度计算其值。

我也会强调构图而不是继承。最终结果确实可以是一个复杂的继承结构。

对我来说,组合是“Composer”类的层次结构,它们不实现接口。如

public class QuadrilateralComposer  {
   private final int iTopMM;
   private final int iBtmMM;
   ...
   public QuadrilateralComposer(int i_topMM, int i_bottomMM, ...)  {
      if(i_topMM < 1)  {
         throw  new IllegalArgumentException...
      }
      if(i_bottomMM < 1)  {
         throw  new IllegalArgumentException...
      }
      ...
      iTopMM = i_topMM;
      iBtmMM = i_bottomMM;
      ...
   }
   public int getTopMillimeters()  {
      return  iTopMM;
   }
   ...

然后由抽象类组成:

public class AbstractQuadrilateral implements Quadrilateral
   private final QuadrilateralComposer qc;
   public AbstractQuadrilateral(int i_topLen, int i_bottomLen, ...)  {
      gc = new QuadrilateralComposer(i_topLen, i_bottomLen, ...);
   }
   public int getTopLength()  {
      return  gc.getTopLength();
   }
   ...

抽象类从不扩展其他抽象类,它们只使用内部Composers(并实际实现接口)。另一方面,Composers只扩展Composers,并在内部使用其他作曲家。

(三个注释:受保护的函数在作为public function_4prot()的Composer中实现,并实现为protected function(),它调用_4prot版本。有时抽象类确实可以实现在这种情况下,它将是具体的[非抽象]并被命名为“SimpleXYZ”,而不是“AbstractXYZ”。最后,静态实用函数驻留在Composer中。)

如果每个接口都是以这种方式设计的,那么任何类都可以轻松实现任何接口,无论它们必须实际扩展哪个类。如果抽象类扩展了其他抽象类,那么对于需要实现接口的类来说,这是更多的工作,但恰好 - 并且必须 - 扩展其他类。

这不是你问的问题,但是学习这个概念会更好地改变我的代码。在接受的答案中看到它,让我思考所有这些。在过去的几年里,我实际上已经慢慢地从继承转向构图,在阅读了Effective Java之后,它仍然是继承棺材中的最后一块钉子。

答案 2 :(得分:0)

好的,现在的计划是我试图在没有任何接口的情况下解决这个问题。所以这是继承地图:

我忽略了这样一个事实:广场不仅是一个矩形而且还是一个菱形。

抽象类(四边形)将定义(但不实现)计算“表面积”和“周长”的方法。覆盖方法很容易,因为每个形状都有不同的计算形式,但我不确定在哪里可以使用重载功能。


还有一件事:使用界面,这会是理想的方式吗?

enter image description here

相关问题