【问题标题】:adding multiple inherited objects to a container class将多个继承对象添加到容器类
【发布时间】:2012-10-09 02:11:11
【问题描述】:

我有一个正在顺利进行的程序,但我似乎无法提前了解如何将某些类添加到容器中。

我正在为一个 2D 人创建一个 java 程序。我有一个抽象类,BodyPart(所有身体部位共有),DrawablePart 和 ContainerPart 类实现了抽象类,其中 Drawable 部分包括实现的类,如头、腿、脚等; ContainerParts 包括实现的类,例如 person > upperbody & lowerbody。

我剩下要做的唯一部分是创建从容器类派生的上半身和下半身类,它有一个 BodyParts 数组。

假设我正在开发从 ContainerPart 派生的 LowerBody 容器。怎么可能有一个可以包含 Legs 和 Feet 数组(从 DrawablePart 派生)的 LowerBody 构造函数?我想让 LowerBody 和 UpperBody 派生自 Avatar 容器,该容器派生自 ContainerPart。

我知道如果不显示我的代码很难得到答案,但我认为有人可以使用我在下面从我的课程中创建的这个 UML 图向我解释它。

这是 UML 图

这是一个包含 BodyParts 数组的 ContainerPart 构造函数(super 来自 BodyPart),这是我想要的,但我需要 LowerBody 的构造函数中的某些部分,例如 Leg 和 Feet:

    public ContainerPart(String name, String color, int xCoord, int yCoord, BodyPart[] yourParts) {
        super(name, color, xCoord, yCoord);
        parts = yourParts;
}

在我的容器类中,我有一个 BodyParts 数组的实例字段,如上面的构造函数所示。但是当我尝试使用多个派生的 BodyPart 时,我得到了这个:

但是,如果我只有一个,在 super() 中说“yourFoot”,它会起作用。

【问题讨论】:

  • 我认为 Drawable 部分应该是一个接口,而不是一个类。
  • 这会更有意义,但我现在需要专注于容器部分。
  • 它仍然会有所帮助。当你想到它时,一切都应该是一个容器,而且大多数都应该是可绘制的。
  • 我很想把这两个问题分开。也就是说,分别对人和表示进行建模。您可能还希望考虑“优先组合优于继承”的规则。例如,您可以拥有一个知道如何绘制人的渲染器,而不是强制人为 Drawable
  • 容器不是可绘制的,在我知道如何将某些身体部位对象添加到 LowerBody 和 UpperBody 之前,我不倾向于在绘图部分工作。

标签: java inheritance abstract-class containers implementation


【解决方案1】:

我无法将其添加为评论,因此放在这里。

如果我理解正确,您的内容如下 (your real constructor has more arguments):

public abstract class BodyPart {
  private String name;
  private String color;
      ......
      ......
}


public class DrawablePart extends BodyPart {

    public DrawablePart(){
        super();
    }
}

public class ContainerPart extends BodyPart {

    public ContainerPart(String name, String color, int xCoord, int yCoord, BodyPart[] yourParts){
        super(......);
        ...........
     }
}

public class Legs extends DrawablePart {

    public Legs(){
        super();
    }
}

现在你想创建LowerBody 为:

public class LowerBody extends ContainerPart {

    public LowerBody(Legs[] legs, Feet[] feet, String name, String color, int xCoord, int yCoord){
         super(name, color,xCoord, yCoord, legs);
         ........
         .......
    }

    public LowerBody(Legs leg, Feet feet, String name, String color, int xCoord, int yCoord){
        super(name, color,xCoord, yCoord, new BodyPart[]{leg, feet});
    }
}

如果是,问题是什么?它应该可以正常工作。如果我遗漏了什么,请告诉我。

【讨论】:

    【解决方案2】:

    也许是个愚蠢的问题。为什么不让 LowerBody 扩展 Avatar?您仍然可以获得 ContainerPart 的好处。

    或者你可以添加一个新的构造函数:

    public LowerBody(List<DrawableParts> parts) {
    
    }
    

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 2016-09-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多