获取对象数据的最佳方式?

时间:2009-10-12 00:41:51

标签: c# delegates xna

我需要在屏幕上显示有关各种游戏对象的一些统计数据,数字和图表。

(例如:相机位置,视野,每秒帧数,填充率,剔除物品数量等等)

目前,任何想要绘制或显示的对象都会沿着以下几行实现一个接口:

public interface IGraphable
{
    float GraphableValue { get; set; }
}

然后可以将该对象发送到要显示的图形组件。这有一些明显的缺点,例如无法绘制属于同一类的2个不同数据。

我想要的是一种将指针传递到数据所在位置的方法,或指向一个知道如何返回数据而不是将对象传递给显示组件的函数的指针。

我认为这是代表们的目的,但我不明白如何在这种情况下使用它们(实际上我根本不理解它们)。另外,还有另一种(更聪明/更好)的方法吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

为什么不像这样反转控件:

public interface IGraphable
{
    void BuildGraphable( IGraph g );
}

interface IGraph {
    void AddValue( double value );
}

这是OO中的首选选项,因为它隐藏了IGraphable实现的细节。此外,您现在可以扩展IGraph以增加功能而不会破坏兼容性。

答案 1 :(得分:0)

根据你的工作方式,你可能会使用Reflection(访问者的属性),尽管起初也可能相对混乱。但它在你的武器库中是一个非常有用的工具,所以非常值得花时间。这是一个关于如何使用它们的精彩教程:

http://www.brainbell.com/tutors/C_Sharp/Attributes.htm

但是,学习代表也非常有用,这听起来像是一个很好的解决方案。我没有深入研究它,但是同一站点上的本教程可能很有用:

http://www.brainbell.com/tutors/C_Sharp/Delegates_and_Event_Handlers.htm

答案 2 :(得分:0)

我决定做以下事情:

public class GraphComponent
{
   private Func<flaot> _function;

   public GraphComponent(Func<flaot> function, ...)
   { ... }
}

这允许我通过写这样的东西来指定数据的检索方式:

FPSComponent fpsc = new FPSComponent();    
GraphComponent fpsg = new GraphComponent(delegate() { return fpsc.ApproximateFPS; }, ...);

答案 3 :(得分:0)

  

我想要的是一种将指针传递到数据所在位置的方法,或指向一个知道如何返回数据而不是将对象传递给显示组件的函数的指针。

如果您不想将对象添加到图表组件,请访问

  

这有一些明显的缺点,例如无法绘制属于同一类的2个不同数据。

也许列表会解决您的问题?

public interface IGraphable
{
    List<float> GraphableValues { get; }
}