如何控制/处理/编辑多个对象?

时间:2013-07-12 17:08:13

标签: c# object

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

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

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

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

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

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分: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

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

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

答案 2 :(得分:1)

一个是看这个问题是将其视为试图移动现实世界的对象。如果你有10个大理石,而你想要移动其中的5个,你会怎么做?你可以将所有这些,一次一个,移动到你想要的地方;或者,您可以将它们分组并移动它们。无论哪种方式,他们都不会神奇地移动自己,他们必须被告知要移动一些东西。

我会识别组中行为的联合,并在某种界面(例如IMoveable)中公开这些行为。然后我会塑造&#34;搬运工。&#34;移动者会选择它感兴趣的对象(或者你可以给它那些,并将拾取行为移动到&#34;选择器&#34;对象),然后你告诉移动者去哪里。它将命令转换为它具有引用的每个对象的命令。

示例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疯狂,但不应该模仿现实世界。只需建模直到问题解决并且可以理解。更难的部分是确定是通过接口还是继承对对象进行分组。

答案 3 :(得分:0)

您想要移动的所有对象共享一些共同点:可以移动它们。对特定对象的移动方式的含义可能不同,但仍然可以移动。

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

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