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);
}

私の問題は、ユーザーが同じオブジェクトを複数配置したい場合、現在の設定方法は、まったく同じオブジェクトが部屋に追加されることを意味し、そのオブジェクトが後で何らかの方法で編集された場合 (ベッドなど) .占有 = true)、部屋内のそのタイプのすべてのオブジェクトに影響します。

リフレクションを使用せずに(別の参照を取得するために)オブジェクトを複製する方法はありますか?

リフレクションの方法は、Type を渡し、Type.GetConstructor を使用してコンストラクターを呼び出す必要があると思いますが、可能であればこれを行いたくありません。リフレクションが唯一の方法である場合、誰かがそれを行う方法のサンプルコードを提供できますか?

編集 - おそらく、変数 currentObject が RoomObject タイプの変数ではなく、Bed などのサブクラスを保持するように指定する必要があります。(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

コピー コンストラクターを使用するか、リフレクションを使用します。

リフレクションを使用すると、想像するほど複雑ではなく、Type と共にActivatorクラスを使用するだけで、その Type のインスタンスを取得できます。

于 2012-12-12T14:07:19.703 に答える
0

リフレクションについて本当に危険なことは何もありません。これは、.NET のようなマネージ言語の優れた点の 1 つです。

私は間違っているかもしれませんが、(同じインスタンスへの 2 つの参照を持つのではなく) オブジェクト インスタンスを複製したいようです。

以下のリンクをご覧ください。

オブジェクトのディープ クローニング

オブジェクトのクローンを作成する方法

追加:

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 に答える