|
とりあえず、書いてみました。 これでいかがでしょうか...。 だいぶ長いです。申し訳ありません。
Hogeクラスに新しいメンバ_xを追加したという想定です。
////////////////////////////// // 旧バージョンのHoge ////////////////////////////// [Serializable] class Hoge : ISerializable { int _n; string _str;
public Hoge(int n, string str) { _n = n; _str = str; }
public int N { get { return _n; } set { _n = value; } }
public string Str { get { return _str; } set { _str = value; } }
public void Greet() { Console.WriteLine("Hi, I'm Hoge."); }
/// <summary></summary> public Hoge(SerializationInfo info, StreamingContext context) { _n = info.GetInt32("n"); _str = info.GetString("str"); }
public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("n", _n); info.AddValue("str", _str); } }
////////////////////////////// // メンバが追加された後のHoge ////////////////////////////// [Serializable] class Hoge : ISerializable { // 委譲先 Hoge2 _hoge2;
public Hoge(int n, string str) { _hoge2 = new Hoge2(n, str); }
public int N { get { return _hoge2.N; } set { _hoge2.N = value; } }
public string Str { get { return _hoge2.Str; } set { _hoge2.Str = value; } }
public double X { get { return _hoge2.X; } set { _hoge2.X = value; } }
public void Greet() { _hoge2.Greet(); }
public override string ToString() { return _hoge2.ToString(); }
public Hoge(SerializationInfo info, StreamingContext context) { int n = info.GetInt32("n"); string str = info.GetString("str");
// 移譲先を作る _hoge2 = new Hoge2(n, str); }
public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("n", _hoge2.N); info.AddValue("str", _hoge2.Str); info.AddValue("x", _hoge2.X); } }
////////////////////////////// // Hogeの仕事を任されてくれるHoge2 ////////////////////////////// [Serializable] class Hoge2 : ISerializable { int _n; string _str;
// 新しいメンバ double _x;
public Hoge2(int n, string str) : this(n, str, 42.0) { }
public Hoge2(int n, string str, double x) { _n = n; _str = str; _x = x; }
public int N { get { return _n; } set { _n = value; } }
public string Str { get { return _str; } set { _str = value; } }
public double X { get { return _x; } set { _x = value; } }
public void Greet() { Console.WriteLine("Mmm..., Am I Hoge?"); }
public override string ToString() { return string.Format("_n={0}, _str={1}, _x={2}", _n, _str, _x); }
public Hoge2(SerializationInfo info, StreamingContext context) { _n = info.GetInt32("n"); _str = info.GetString("str"); _x = info.GetDouble("x"); }
public void GetObjectData(SerializationInfo info, StreamingContext context) { info.AddValue("n", _n); info.AddValue("str", _str); info.AddValue("x", _x); } }
> ・ソースコード中の「Hoge1」を「Hoge2」に置換していく必要がある ってのは大きな誤解だったんですかね。 そのままHogeを使ってもよさげ...、なのかな。 いや、でもHogeを使ってたんじゃ、_xは常にデフォルト値(ここではHoge2のコンストラクタで与えた42)が使われるってことか。 ...ぁあれ?
|