nsf*_*way 5 memory arrays list vector
使用矢量/列表是浪费/糟糕的设计,在大多数情况下,它只有一个元素?
例:
class dragon
{
ArrayList<head> = new ArrayList<head> Heads;
tail Tail = new tail();
body Body = new body();
dragon()
{
theHead=new head();
Heads.add(theHead);
}
void nod()
{
for (int i=0;i<Heads.size();i++)
{
heads.get(i).GoUpAndDown();
}
}
}
class firedragon extends dragon
{
}
class icedragon extends dragon
{
}
class lightningdragon extends dragon
{
}
// 10 other one-headed dragon declarations here
class hydra extends dragon
{
hydra()
{
anotherHead=new head();
for (int i=0;i<2;i++)
{
Heads.add(anotherHead);
}
}
}
class superhydra extends dragon
{
superhydra()
{
anotherHead=new head();
for (int i=0;i<4;i++)
{
Heads.add(anotherHead);
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:(问题的第2部分)
谢谢你的回复.他们非常乐于助人.我实际上不止一次遇到过这种情况,我想给出第二个与继承无关的例子.这实际上是一个真实世界的例子,尽管我已经确定我目前的项目规模小到足以使用基于你的答案的向量来保证安全,但我认为这个概念我会在更大的范围内使用点.
在为我当前的Android游戏项目创建引擎时,我发现有必要创建一个Imagepoint对象,该对象基本上是一组XY坐标,用于跟踪精灵图像的重要部分.假设你有一个由几个位图组成的骨骼角色,知道颈部连接到躯干,前臂到二头肌的位置等是有用的.这个xy偏移数据稍后用于计算各种目的的位置,例如通过使用三角函数来定位其他精灵,以在给定当前角度的情况下找到xy偏移.
大多数精灵对象只需要一个图像点.二头肌需要一个用于前臂,前臂需要一个用于手,颈部需要一个用于头部等.我目前的角色模型中的躯干是例外,他们需要几个用于肩膀,腿部,颈部,以及任何可拆卸的装饰精灵.
精灵是包含图像点矢量的对象,没有继承的类,因为每个:躯干,腿等只是精灵类的一个实例,它严格来说是一个图形对象,包含一个指向位图的指针,这些图像点和各种位置/方向数据,不会用于任何专门用途.如果我在具有大量实例的大型游戏中使用这个概念,其中大多数只需要一个图像点,一些对象需要几个或没有,并且没有特殊情况值得使用继承.你的想法是什么?
是和不是。
我的意思是你的问题实际上取决于你将如何使用这些对象..就我个人而言,我喜欢尽可能地分割行为和属性,以便根据它们所代表的对象类型对它们进行“聚类”,而不关心稍微重用一些代码与您提出的真正继承方法相比,要少一些。就像是:
interface BigLizard
{
void nod();
}
class Dragon implements BigLizard
{
Head head;
void nod() { head.upAndDown(); }
}
class ReallyScaryDragon extends Dragon { ... }
class Hydra implements BigLizard
{
ArrayList<Head> heads;
void nod() { for (Head h : heads) h.upAndDown(); }
}
Run Code Online (Sandbox Code Playgroud)
等等。这种方法就像“恰好拥有对象所需的东西,而不强迫任何东西成为特定情况”。当然,这意味着它将有两种不同的实现nod()但是当您不需要优化时(并且您应该只在最后关心它),只需坚持您的个人喜好,假设它不违反任何标准,被广泛接受的惯例。
您不必使任何内容从单个对象继承,只需根据需要自定义层次结构。如果“头部”的概念与以下内容不同,复合解决方案(如已经建议的)也将是一个解决方案你的Dragon和为了你的Hydra..
针对您的具体情况的第三种解决方案可能是使用 aLinkedList而不是ArrayList. 在这种情况下,只要你只有一个头,你就不会浪费空间(除了列表的实例化),并且你只会有next(列表的头:D)指向任何地方的指针。