1

我正在制作一个游戏,其中涉及将对象放置在房间中。房间存储可以放置在其中的对象列表,例如

List<RoomObject> possibleObjects = new List<RoomObject>(){ new Bed(), new Table() };

然后将这些对象分别发送到允许用户单击按钮的按钮,进入所选对象的放置阶段,然后用户在房间中单击,然后放置对象。

例如

public Room currentRoom;
public RoomObject currentObject;
//...
public void onClick()
{
    if (CanPlace) currentRoom.Add(currentObject);
}

我的问题是,如果用户想要放置多个相同的对象,它的当前设置方式将意味着完全相同的对象将被添加到房间,并且如果该对象稍后以某种方式进行编辑(例如床.occupied = true),它将影响房间中该类型的所有对象。

有没有一种方法可以复制一个对象(以获得单独的引用),而我不必使用反射(我不是很熟悉,感觉是不安全的代码)。

我假设反射方式将传递一个类型,然后必须使用 Type.GetConstructor 调用构造函数,但如果可能的话,我宁愿不这样做。如果反射是唯一的方法,有人可以提供如何做到这一点的示例代码吗?

编辑 - 也许我需要指定我的变量 currentObject 不会保存类型 RoomObject 的变量,而是一个子类,例如 Bed。(床继承自 RoomObject)。

4

4 回答 4

4

您应该为您的对象定义一个复制构造函数。这将允许您基于该类的另一个实例的值来实例化一个类。这是一个教程:

http://msdn.microsoft.com/en-us/library/ms173116(v=vs.80).aspx

public class RoomObject
{
    public RoomObject(RoomObject roomObject)
    {
    //Copy room object properties
    }
}

public class Bed : RoomObject
{
    public Bed(Bed bed) : base(bed)
    {
    //Copy Bed properties
    }
}

用法

Bed bedOne = new Bed();  

Bed bedTwo = new Bed(bedOne);  //Create a bed using Bed copy constructor

RoomObject roomObject = new RoomObject(bedOne)  //Creates a room object using RoomObject copy constructor

进一步编辑

public abstract class RoomObject<T> where T : new()
{
    protected T CreateRoomObjectCopy(T roomObject)
    {
        T concreteType = new T();
        //Copy Room object properties
        return concreteType;
    }

    public abstract T Copy(T roomObject);
}

public class Bed : RoomObject<Bed>
{
    public override Bed Copy(Bed roomObject)
    {
        Bed newBed = CreateRoomObjectCopy(roomObject);
        //Copy bed properties
        return newBed;
    }
}
于 2012-12-12T14:03:31.307 回答
2

使用复制构造函数或反射。

通过反射,它并不像您想象的那么复杂,只需将Activator类与 Type 一起使用,您就可以获得该 Type 的实例。

于 2012-12-12T14:07:19.703 回答
0

反射没有什么不安全的。它是 .NET 等托管语言的优点之一。

我可能错了,但听起来你想克隆一个对象实例(而不是对同一个实例有两个引用)。

看看下面的链接。

深度克隆对象

如何克隆对象

额外的:

您可以尝试实现 ICloneable,从而提供您自己的机制来克隆对象

示例:

public class RoomObject : ICloneable
{
    public object Clone()
    {
        return new RoomObject { X = this.X, Y = this.Y, Z = this.Z };
    }
}


RoomObject ro = new RoomObject();

RoomObject ro2 = (RoomObject)ro.Clone();
于 2012-12-12T14:07:51.853 回答
0
class Program
{
    static void Main(string[] args)
    {
        Bed bed = RoomObject.RoomName("Bed");
        Console.WriteLine(bed.name);
       //outline:Bed
        Console.Read();
    }
}
public class RoomObject
{
    public static Bed RoomName(string BedName)
    {
        Bed newBed = new Bed();
        newBed.name = BedName;
        return newBed;
    }
}
public class Bed
{
    public string name { get; set; }
}
于 2018-12-19T10:04:05.950 回答