У меня есть 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;
}
Но выдается ошибка:
не может преобразовать объект 'в' 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);
}
}
Поскольку они определенно влияют на мою программу, даже когда я печатаюдоска это выглядит то же самое.Я не думаю, что что-то клонируется 1034 *, но возвращается ссылка.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
на самом деле не имеет никаких свойств.У проверки есть только два свойства перечисления:
public enum Color { Black, White };
public enum Class { Man, King };
public class Checker : Tile
{
public Color Color { get; set; }
public Class Class { get; set; }