C# 跨类对象
本文关键字:对象 | 更新日期: 2023-09-27 18:36:56
我正在开发非常简单的Roguelike游戏(只是为了我自己),并得到一个问题:
由于无法创建可以从程序的任何类访问的跨类结构对象(游戏案例中的实体),因此使用什么来创建跨类对象?我正在考虑将所有新创建的对象(enities)存储在静态对象数组中,但我想在这个问题上有更简单的解决方案。
问题本身:如何使用自己的属性创建跨类可访问对象?
谢谢大家,我找到了我正在寻找的东西。
似乎您尝试在不同类之间传递值类型(struct
),并且您注意到当您在一个位置更新值时,它不会更改另一个位置的值。
这是值类型和引用类型之间的基本区别。
如果您自己创建struct
,则可能需要将其定义为类。
如果没有,您可以将所有结构包装在一个类中,并将该类作为状态对象传递。
如果您所拥有的只是相同类型结构的列表(如 Points),只需传递列表本身即可。 C# 集合作为类实现。
public class GameState
{
public Point PlayerLocation { get; set; }
public List<Point> BulletPoints { get; set; }
public double Health { get; set; }
}
现在,您可以创建一个 GameState 并将其传递给不同的类:
public class Game
{
private GameState _state = new GameState();
private BulletUpdater _bulletUpdater = new BulletUpdater();
public void Update()
{
_bulletUpdater.UpdatePoints(_state);
// Points have now been modified by another class, even though a Point is a struct.
}
}
public class BulletUpdater
{
public void UpdatePoints(GameState state)
{
for (int i = 0; i < state.BulletPoints.Count; i++)
{
Point p = state.BulletPoints[i];
state.BulletPoints[i] = new Point(p.X + 1, p.Y + 1);
}
}
}
只要记住上面的代码,如果我要写:
Point p = state.BulletPoints[i];
p.X += 1;
p.Y += 1;
这不会影响原点! 当您从列表或类读取值类型时,仅将该值复制到局部变量中。 因此,为了反映存储在引用类型中的原始对象中的更改,您需要像这样覆盖它:
state.BulletPoints[i] = p;
同样的原则是以下方法也不起作用的原因:
state.PlayerLocation.X += 5; // Doesn't do anything
state.PlayerLocation.Y += 5; // Also doesn't do anything
在这种情况下,编译器会告诉您您做错了什么。 您只是修改属性的返回值,而不是支持字段本身。 你必须这样写:
state.PlayerLocation = new Point(state.PlayerLocation.X + 5, state.PlayerLocation.Y + 5); // This works!
您可以执行以下操作:
-
使用IoC框架,如Ninject。您可以将 Ninject 设置为为所有用法创建单个实例。
-
另一种选择是使用单例模式设计模式
-
第三个是使用静态属性
听起来你想使用单例模式:http://en.wikipedia.org/wiki/Singleton_pattern
下面是在 C# 中的示例:
public class Singleton
{
static Singleton()
{
Instance = new Singleton();
}
public static Singleton Instance { get; private set; }
}
这是可能的。public
和static
课呢?
public static class CrossClassObject
{
public static object MyProperty { get; set; }
public static void MyMethod() {}
}
当然,这个类应该放在与其他类相同的命名空间中。
如何使用?
class OtherClassInTheSameNamespace
{
private void SomeMethod()
{
var localVariable = CrossClassObject.MyProperty; // get 'cross-class' property MyProperty
CrossClassObject.MyMethod(); // execute 'cross-class' method MyMethod()
}
}
不知道你想实现什么...但是,如果你想要一个可"跨类"访问的对象列表,只需创建一个带有对象列表的静态类,然后当你从任何其他类引用你的类时,你将可以访问它的对象列表。这是这样的:
public static class ObjectController
{
private static IList<object> existingObjects;
public static IList<object> ExistingObjects
{
get
{
if (existingObjects == null)
{
existingObjects = new List<object>();
}
}
}
}
public class MyObject
{
public MyObject()
{
ObjectController.ExistingObjects.Add(this);
}
public void Delete()
{
ObjectController.ExistingObjects.Remove(this);
}
}
然后你可以添加类似的东西
MyObject newObj = new MyObject();
//// other stuff... This object should now be visible to whatever other class references ObjectController
newObj.Delete();