1

我想要一些关于哪个类应该保存某些信息的指导。如果我有一个在“空间对象”内四处移动的“移动对象”,移动对象是否真的关心它在空间对象中的位置、移动的速度以及向哪个方向移动?

将属性分配给“位置”的移动对象当然看起来很方便,但我认为它确实对此没有任何顾虑。所以我想出了:

class Mobile
    {        
        //some properties/fields/etc

        event EventHandler<MovementEventArgs> move;

        public void Move(Vector direction)
        {
            raiseMove(direction);
        }

        private raiseMove(Vector direction)
        {
            EventHandler<MovementEventArgs> handler = move;
            if (move != null)
                handler(this, New MovementEventArgs(direction));
        }
    }

class Space
    {
        Mobile someObject;
        Vector someObjectLocation;

        public Space()
        {
            someObject = new someObject();
            someObject.Move += HandleMobileMove;
        }

        public void MoveSomeObject(Vector direction)
        {
            someObject.Move(new Vector(1,0));
        }

        private void HandleMobileMove(object sender, MovementEventArgs e)
        {
            someObjectLocation += e.Direction;
        }
    }

写的有点仓促……但我希望它能传达我的意思。总而言之:手机应该拥有一个位置,还是空间?谁应该控制运动?

4

3 回答 3

1

在 WPF 中,Canvas 对象负责了解其子对象的位置。这将为您的方法提供可信度(它使用与附加属性类似的结构)。

如果您对存储在 Space 对象中的位置感到不舒服,您还可以使用装饰器模式将附加信息附加到 Mobile 对象。这将使您可以选择是否定位对象,而无需关注对象本身。

在获取孩子的集合时,您可以只过滤掉那些使用您的位置装饰器的对象(可能使用 OfType 扩展方法)并使用它们做您需要的事情。您必须转换为使用接口而不是硬类引用。不过,这可能是件好事。

但最终,这取决于您的 Space 和 Mobile 对象在做什么。如果 Space 对象正在显示 Mobile 对象(如 Canvas),那么它需要知道位置信息,但 Mobile 不需要。另一方面,如果移动设备本身使用它们的位置信息来跟踪某事或执行某项任务(而 Space 对象并不关心,可能只提供边界等),那么最好将该信息存储在他们。

为了进一步说明这一点,请问自己这个问题:如果我改变位置,谁在乎?控件是 WPF 通常不受其 Top 和 Left 坐标的影响,但其容器控件受此影响,因此将这些信息存储在容器中是有意义的。如果您更改移动设备的位置,这会对移动设备或其工作方式产生任何影响吗?如果 Mobile X 从 Y 移动到 Z,Space 的行为是否会有所不同?

于 2012-06-12T18:19:36.320 回答
1

以纯粹的 OOP 术语思考,我认为这些当然应该是移动对象的属性,就像我的位置和速度是我在空间中移动时的属性一样。如果您的空间对象需要访问这些属性以进行边界检查,它可以从移动实例上的公共 get 方法中检索它们。

于 2012-06-12T23:27:23.337 回答
1

你的论点是合乎逻辑的,但想想someObject.Move += HandleMobileMove;你的实现(someObjectLocation +=)的浪费:本质上你是在浪费this指针。你Mobile当然和它有 1:1 的关系,Location我希望一个Space类与它有 1:M 的关系Mobile(除非你在空间中只有 1 个对象)。在您的设计中,这需要您Space维护 to 的关联MobileLocation这很麻烦,特别是因为替代方案只是简单地制作Location您的Mobile.

于 2012-06-12T23:40:40.660 回答