分類:[C#]
はじめまして。WindowsXP、VS2008C#、XNAでゲームを作成している途中なのですが、
その中でキャラクターの複製を行う際、ref修飾詞に悩まさています。
コンソールで簡略化したコードを作りましたので、よろしくおねがいします。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class SubData
{
private int testdata;
//保持している値を取得
public int GetData() { return testdata; }
/// <summary>
/// データを入力するコンストラクタ
/// </summary>
/// <param name="data">値</param>
public SubData(int data)
{
testdata = data;
}
}
public class MainDataClass : ICloneable
{
private SubData m_RefData;
/// <summary>
/// 自分のデータをコピーする(ref有り)
/// </summary>
/// <param name="Dest"></param>
public void CopyData(ref MainDataClass Dest)
{
Dest = (MainDataClass)Clone();
}
/// <summary>
/// 自分のデータをコピーする(ref無し)
/// </summary>
/// <param name="Dest"></param>
public void CopyDataNoRef(MainDataClass Dest)
{
Dest = (MainDataClass)Clone();
}
/// <summary>
/// 簡易コピーでクローンを生成する
/// </summary>
/// <returns>クローンobject</returns>
public object Clone()
{
return MemberwiseClone();
}
/// <summary>
/// デバック用出力
/// </summary>
public void OutPut()
{
Console.WriteLine(m_RefData.GetData());
}
/// <summary>
/// 参照データを設定する
/// </summary>
/// <param name="rd"></param>
public void SetRefData(SubData rd)
{
m_RefData = rd;
}
}
//派生クラス
public class ChildMain : MainDataClass
{
public int dummydata = 0;
}
class Program
{
static void Main(string[] args)
{
//今後生成するコピーは全てこのSubを参照している状態にしたい
SubData Sub = new SubData(10);
//コピー生成元となるインスタンスを生成
MainDataClass Org = new MainDataClass();
//参照元を設定
Org.SetRefData(Sub);
//ここではちゃんと10が出力される
Org.OutPut();
//テスト(1)ref有りコピー
MainDataClass CopyData1 = new MainDataClass();
Org.CopyData(ref CopyData1);
//10が出力される
CopyData1.OutPut();
//テスト(2)ref無しコピー
MainDataClass CopyData2 = new MainDataClass();
Org.CopyDataNoRef(CopyData2);
//出力できない
CopyData2.OutPut();//(※実行時エラー)
//テスト(3)派生クラスにref有りコピー
ChildMain CopyChild1 = new ChildMain();
//↓ref有りだとコピーが出来ない
Org.CopyData(ref CopyChild1);//(※コンパイルエラー)
//↓キャストも出来ない
Org.CopyData(ref (MainDataClass)CopyChild1);//(※コンパイルエラー)
//テスト(4)派生クラスにref無しコピー
ChildMain CopyChild2 = new ChildMain();
//↓ref無しだとコピーはできるが…
Org.CopyDataNoRef(CopyChild2);
//出力できない
CopyChild2.OutPut();//(※実行時エラー)
//理解できない疑問オマケ
List<MainDataClass> list = new List<MainDataClass>();
list.Add(CopyData2);
Org.CopyData(ref list[0]);//(※コンパイルエラー)
}
}
}
|