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