2

我对 OOP 很陌生,但我一直在玩弄 C#。一个人如何控制多个对象?

假设您有几何对象(三角形、球体等),它们都共享一个属性,即空间中的 (x,y,z) 点坐标。现在,单独移动每个不同的对象很容易。例如 rectangle.moveright(); 等等

但是假设我有 n 个不同的对象要作为一个组移动,有点像在桌面上标记图标/快捷方式并将它们作为一个组移动。

如何做到这一点?基本上你有一个控制子对象的父对象

编辑:一个更具体的例子;假设我有 10 个不同种类的对象,我只想移动 5 个具有某些功能的对象,稍后我想将其他 4 个对象移动到其他地方。总是作为一个群体

4

4 回答 4

3

这是一个非常简单的例子。请注意,移动功能和点并不准确,显然需要实施才能使这项工作。

创建一个接口和抽象类以允许对象组的继承和多态性。

public interface IPositionable
{
 void Move(int x, int y, int z);
}

public abstract class Positionable : IPositionable
{
 public int x { get; set; }
 public int y { get; set; }
 public int z { get; set; }

 public void Move( int x, int y, int z )
 {
    this.x += x;
    this.y += y;
    this.z += z;
 }
}

Next 将这些利用到您将使用的形状类型中

public class Rectangle : Positionable{}
public class Triangle : Positionable{}
public class Square : Positionable{}

准备好基本部分后,您应该使用Mediator Pattern

public class PositionMediator
{
 public List<IPositionable> Group { get; set; }
 public PositionMediator()
 {
    Group = new List<IPositionable>();
    Group.Add(new Rectangle());
    Group.Add(new Triangle());
    Group.Add(new Square());
 }
 public void MoveGroup( int x, int y, int z )
 {
    foreach( var pos in Group )
    {
        pos.Move(x,y,z);
    }
 }
}

一旦到位,您可以像这样控制它:

void Main()
{
 var pm = new PositionMediator();
 pm.MoveGroup(1,2,3);
}
于 2013-07-12T17:21:12.013 回答
1

一种是看待这个问题,就是把它看作是试图移动现实世界的物体。如果你有 10 个弹珠,你想移动其中的 5 个,你会怎么做?您可以一次将它们全部移动到您希望它们去的地方;或者,您可以将它们分组并移动它们。无论哪种方式,它们都不会神奇地移动自己,它们必须被告知移动。

我会识别组中行为的联合,并在某种界面(例如IMoveable)中公开这些行为。然后我会为“移动者”建模。移动器会挑选它感兴趣的对象(或者你可以给它那些,并将拾取行为移动到“选择器”对象),然后你告诉移动器去哪里。它将命令转换为它所引用的每个对象的命令。

示例IMoveable

public interface IMoveable
{
    void MoveTo(Position position);
    void MoveBy(int dx, int dy);
}

示例Mover

public class Mover
{
    private List<IMoveable> _moveables = new List<IMoveable>();

    public void AddAsTarget(IMoveable moveable)
    {
        _moveables.Add(moveable); // Null checks, and such, yada...
    }

    public void Reposition(int dx, int dy)
    {
        foreach(var moveable in _moveables)
        {
            moveable.MoveBy(dx, dy);
        }
    }
}

总的来说,它必须适合您的用例。你可以用 OOP 发疯,但不应该模拟现实世界。只是建模,直到问题得到解决并且可以理解。更难的部分是确定是通过接口还是继承来对对象进行分组。

于 2013-07-12T17:27:46.330 回答
1

没有按照您在 OOP 中描述的方式对对象进行分组的固有方法。但是有几种方法可以达到相同的效果。

假设您使用继承层次结构进行设置。

首先定义一个名为 Shape 的基类,它只实现了 X,Y,Z

public class Shape
{
    public int X {get;set;}
    public int Y {get;set;}
    pulbic int Z {get;set;}
}

然后,您使用几种不同的形状扩展该类。

public class Triangle : Shape
{
    public string classification {get;set;}
}

public class Square : Shape
{
    public double area {get;set;}
}

然后,您可以制作一个形状列表,其中包含扩展形状的任何类型的对象

List<Shape> ShapeSet;

ShapeSet.Add(myTriangle);
ShapeSet.Add(mySquare1);
ShapeSet.Add(mySquare4);

然后你可以做这样的事情

foreach (Shape s in ShapeSet)
   s.X += 5;//move every shape in the set over by 5 along the X axis

可以根据需要从各个对象实例动态构建列表。

这只是完成任务的一种方法,不一定是最好的方法,也不是唯一的方法。但这是一个很好的例子。(同样的事情可以使用形状接口完成,而不是类)

于 2013-07-12T17:19:06.993 回答
0

您想要移动的所有对象都有一个共同点:它们可以移动。移动对于特定对象的含义可能不同,但它们仍然是可移动的。

在对象结构中反映这一点的一种方法是使所有此类对象实现相同的接口,调用它IMoveable,然后为每个可移动对象提供接口的实现。

这样,其余代码可以调用此接口的方法,而无需真正关心正在移动的特定对象

于 2013-07-12T17:15:53.113 回答