Лучший способ получить данные объекта? - PullRequest
0 голосов
/ 12 октября 2009

Мне нужно отобразить некоторые статистические данные, цифры и графики о различных игровых объектах на экране.

(примеры: положение камеры, поле обзора, количество кадров в секунду, скорость заполнения, количество отбракованных объектов и т. Д.)

В настоящее время любой объект, который хочет быть представлен или отображен, реализует интерфейс по следующим направлениям:

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

Затем этот объект может быть отправлен в компонент графика для отображения. Это имеет ряд очевидных недостатков, таких как невозможность отображения двух разных частей данных, принадлежащих одному и тому же классу.

Мне нужен способ передать указатель на то, где находятся данные, или указатель на функцию, которая знает, как вернуть данные, а не передавать объект компоненту отображения.

Я считаю, что это то, для чего нужны делегаты, но я не понимаю, как использовать их в этом контексте (на самом деле я их совсем не понимаю). Кроме того, есть ли другой (умнее / лучше) способ сделать это?

Спасибо!

Ответы [ 4 ]

1 голос
/ 12 октября 2009

Почему бы не инвертировать управление следующим образом:

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

interface IGraph {
    void AddValue( double value );
}

это предпочтительный вариант в ОО, так как он скрывает детали реализации IGraphable. Кроме того, теперь вы можете расширить IGraph для дополнительной функциональности, не нарушая совместимость.

0 голосов
/ 13 октября 2009

Мне нужен способ передать указатель на то, где находятся данные, или указатель на функцию, которая знает, как вернуть данные, а не передавать объект компоненту отображения.

Если вы не хотите добавлять свои объекты в ваш компонент графика, ПОТОМУ ЧТО

Это имеет ряд очевидных недостатков, таких как невозможность отображения 2 разных фрагментов данных, принадлежащих одному и тому же классу.

Может быть, список решит вашу проблему?

public interface IGraphable
{
    List<float> GraphableValues { get; }
}
0 голосов
/ 12 октября 2009

Я решил сделать следующее:

public class GraphComponent
{
   private Func<flaot> _function;

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

Это позволяет мне указать способ получения данных, написав что-то вроде этого:

FPSComponent fpsc = new FPSComponent();    
GraphComponent fpsg = new GraphComponent(delegate() { return fpsc.ApproximateFPS; }, ...);
0 голосов
/ 12 октября 2009

В зависимости от того, как вы делаете вещи, вы можете использовать Reflection (атрибуты на методах доступа), хотя это может сначала быть довольно запутанным. Но это очень полезный инструмент в вашем арсенале, поэтому стоит потратить время на него. Вот отличное руководство по их использованию:

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

Но тогда обучение делегатов также очень полезно, и это звучит как хорошее решение. Я не углублялся в это, но этот учебник на том же сайте может быть полезен:

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

...