このメソッドを持つTile
クラスがあります:
public object Clone()
{
return MemberwiseClone();
}
Checker
そして、から継承する別のクラスTile
。
であるBoard
クラスもありList<Tile>
ます。ボードのクローンを作成したいので、次のように記述しました。
public Board Clone()
{
var b = new Board(width, height);
foreach (var t in this) b.Add(t.Clone());
return b;
}
しかし、それはエラーをスローします:
'object'から'Checkers.Tile'に変換できません
これで、メソッドが代わりにTile.Clone
返すようにすることができますが、サブの追加のプロパティもコピーしますか?Tile
MemberwiseClone
Checker
Board.Clone
それが問題ではない場合、上記の方法とこれの意味上の違いは何ですか?
public Board Clone()
{
using (var ms = new MemoryStream())
{
var bf = new BinaryFormatter();
bf.Serialize(ms, this);
ms.Position = 0;
return (Board)bf.Deserialize(ms);
}
}
ボードを印刷しても同じように見えますが、プログラムに与える影響は間違いなく異なります。何かが複製されているとは思いませんが、参照が返されています。Board
ctorは次のようになります。
public Board(int width = 8, int height = 8)
{
this.width = width;
this.height = height;
this.rowWidth = width / 2;
this.Capacity = rowWidth * height;
}
このTile
クラスには実際にはプロパティがありません。チェッカーには2つの列挙型プロパティがあります。
public enum Color { Black, White };
public enum Class { Man, King };
public class Checker : Tile
{
public Color Color { get; set; }
public Class Class { get; set; }