Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 面向对象设计表示其他对象的对象集合_Oop - Fatal编程技术网

Oop 面向对象设计表示其他对象的对象集合

Oop 面向对象设计表示其他对象的对象集合,oop,Oop,我举了个例子 我有一节课 class Person { //stuff } 这个类的对象在这里和那里使用等等,但我想单独创建一个类,负责绘制人员。因此,我需要屏幕上Person对象的位置 我可以从个人继承: class PersonVis : Person { Point location; } 但是我不确定PersonVis是否应该与Person有“是”的关系 我可以用Person作为键,用PersonProperties作为值来制作字典: class PersonProp

我举了个例子

我有一节课

class Person
{
    //stuff
}
这个类的对象在这里和那里使用等等,但我想单独创建一个类,负责绘制人员。因此,我需要屏幕上
Person
对象的位置

我可以从
个人继承

class PersonVis : Person
{
    Point location;
}
但是我不确定
PersonVis
是否应该与
Person
有“是”的关系

我可以用
Person
作为键,用
PersonProperties
作为值来制作字典:

class PersonProperties
{
    Point location;
}
但我可能会遇到这样一种情况,
PersonProperties
类的属性之一取决于
Person
的状态,因此我可能不使用字典,而应该只使用以下列表:

class PersonProperties
{
    Person person;
    Point location;
}
但是如果我这样做了,我在将
PersonProperties
的新对象插入该列表时必须非常小心,因为我可能会得到两个对象,其中包含相同的
Person
实例

在你看来,什么是最好的选择

编辑

我想我必须拿出真实的例子

我有类
Graph

class Graph
{
    List<Vertex> Vertices;
    //other stuff
}

class Vertex
{
    //stuff not related to drawing at all
}
顶点可以移动,所以必须重新绘制图形更改和图形的属性

XXX是保存有关当前顶点点等信息的结构

我不知道我应该选择什么样的XXX

XXX可以是:
字典
其中
顶点属性

class VertexProperties
{
    Point location;
}
class VertexProperties
{
    Vertex vertex;
    Point location;
}
但我可能会遇到这样的情况,
vertexproperty
类的属性之一取决于
Vertex
的状态。因此,可能
列表
其中
顶点属性

class VertexProperties
{
    Point location;
}
class VertexProperties
{
    Vertex vertex;
    Point location;
}
但是,如果我这样做,在将
vertexproperty
的新对象插入该列表时必须非常小心,因为我可能会得到两个对象,其中包含相同的
Vertex
实例

并且可能
列表
其中
垂直视野

class VertexVis : Vertex
{
    Point location;
}

但这与前面的相同+我不觉得
顶点
“是一个“
顶点
”,我不知道Person和PersonProperties之间有什么区别;也许你可以说:

class Person
{
  class Properties
  {
    Point location;
  }

  Properties properties;
}
画家可能不应该把它画的东西分类;相反,我想你想要:

class Screen
{
  void paint(Person person) {...}
}

我不知道人与人之间的区别是什么;也许你可以说:

class Person
{
  class Properties
  {
    Point location;
  }

  Properties properties;
}
画家可能不应该把它画的东西分类;相反,我想你想要:

class Screen
{
  void paint(Person person) {...}
}

我认为你最好的选择是让一个人知道他自己的位置。例如:

class Person {
   string name;
   Point location;
   //any other fields...
 }

我认为你最好的选择是让一个人知道他自己的位置。例如:

class Person {
   string name;
   Point location;
   //any other fields...
 }

这取决于你如何看待你的人,这个实体在你的领域中代表什么,如果它是一个用于绘制的对象,那么把点放在里面,然后忘记它,但是如果你的人与绘制无关,那么你的绘制子系统知道一些关于人的信息,而域对绘制一无所知,而您需要另一个实体,例如DrawablePerson(可能不是一个很好的名称),它将包含绘图所需的所有数据,并且可以像这样初始化:

Person person = //comes from somewhere

DrawablePerson drawablePerson = new DrawablePerson(person);

所以这取决于你的模型。

这取决于你如何看待你的人,这个实体在你的领域中代表了什么,如果它是一个用于绘画的对象,那么把点放进去,然后忘掉它,但是如果你的人与绘画无关,因此,您的绘图子系统知道一些关于Person的信息,而域对绘图一无所知,这就需要另一个实体,例如DrawablePerson(可能不是一个很好的名称),它将包含绘图所需的所有数据,并且可以像这样初始化:

Person person = //comes from somewhere

DrawablePerson drawablePerson = new DrawablePerson(person);

因此,它取决于您的模型。

我一直使用具有渲染属性的对象引用数据的版本,如果需要,它还具有用于更改模型的侦听器。我从不需要优化从一个人到其渲染的映射-通常,渲染数据的操作速度很慢,如果您需要快速响应更改演示文稿以更改模型,则侦听器将处理该问题-只需合并重画事件,而不是在每次更改时重画

但如果我这样做,我必须非常小心地将PersonProperties的新对象插入到该列表中,因为我可能最终得到两个对象,其中包含相同的Person实例


不特别-在开始时为模型中的所有人员创建渲染,并在将人员添加到模型时创建渲染,如果从模型中删除该人员,则删除渲染。不需要其他任何东西。

我一直使用具有渲染属性的对象引用数据的版本,如果需要,它还具有用于更改模型的侦听器。我从不需要优化从一个人到其渲染的映射-通常,渲染数据的操作速度很慢,如果您需要快速响应更改演示文稿以更改模型,则侦听器将处理该问题-只需合并重画事件,而不是在每次更改时重画

但如果我这样做,我必须非常小心地将PersonProperties的新对象插入到该列表中,因为我可能最终得到两个对象,其中包含相同的Person实例


不特别-在开始时为模型中的所有人员创建渲染,并在将人员添加到模型时创建渲染,如果从模型中删除该人员,则删除渲染。不需要其他任何东西。

您可能正在寻找或类似的东西。这将对象(Person)与其表示(PersonView,这将是另一个类)分开。我会让你自己研究更多,因为有太多好的网站可供选择。通常PersonView(视图)包含对Person(模型)的引用

这种方法的许多优点之一是您可以更改Vi