Как удалить эту косвенность из моей игрушечной реализации ECSC#

Место общения программистов C#
Ответить
Anonymous
 Как удалить эту косвенность из моей игрушечной реализации ECS

Сообщение Anonymous »

Ниже приведена простая реализация игрушечного объекта ECS. Сигнатура метода DerefData(GameBehavior) требует использования параметра GameBehavior для поиска по индексу.
Значение GameBehavior должно быть установлено. по типу,Flyable.BehaviorID. Но чтобы это знать, нам нужен экземпляр, который не работает, поскольку цель метода deref — получить экземпляр из универсального типа.
Желательно не использовать Reflection как чтобы быть как можно более быстрым.
Можно ли провести рефакторинг, чтобы использовать только BaseGameObject DerefData() без параметров?
using System;

GameObject gameobj = new();

Flyable fdata = new Flyable { Velocity = 0d };

gameobj.AddBehavior(fdata);

var flightdata = gameobj.DerefData(GameBehavior.Flyable);
// i'd like to remove the parameter from this method signature.
// Which means we need access to IBehavior.BehaviorID,
// which is a 'type-level' property that in theory shouldn't need an object to lookup the value.

interface IBehavior
{
GameBehavior BehaviorID { get; }
}

struct Flyable : IBehavior
{
public GameBehavior BehaviorID => GameBehavior.Flyable;
public double Velocity;
}

[Flags]
enum GameBehavior : int
{
Flyable,
Burnable
}

class GameObject : BaseGameObject{}

abstract class BaseGameObject where T : IBehavior
{
T[] Items = new T[32]; // Max number of enum flags; this ECS is limited to at max 32 behaviors per game object

public U DerefData(GameBehavior behavior) where U : T
{
return (U)Items[(int)behavior]; // We don't have an object instance to lookup behavior ID
}

public void AddBehavior(U obj) where U : T
{
Items[(int)obj.BehaviorID] = obj; // we have an object instance to lookup BehaviorID
}

}


Подробнее здесь: https://stackoverflow.com/questions/784 ... ementation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»