using System.Collections.Generic; using Vector2I = Vector.Vector2I; using static IPiece; public abstract class AbstractPiece(string name = "", Vector2I? pos = null, IPieceOn? on = null) : IPiece { private Vector2I pos = pos ?? new(); // 注意这个坐标的非像素坐标而是棋盘坐标 private bool isSelected = false; protected string name = name; private Dictionary data = []; protected IPieceOn? on = on; public virtual IPieceOn? On { get => on; set => on = value; } public virtual Vector2I Pos { get => pos; set { if (pos != value) { var oldPos = pos; pos = value; on?.OnPos(this, oldPos); } } } public virtual bool IsSelected { get => isSelected; set { if (isSelected != value) { var oldIsSelected = isSelected; isSelected = value; on?.OnSelected(this, oldIsSelected); } } } public virtual string Name { get => name; set { if (name != value) { var oldName = name; name = value; on?.OnName(this, oldName); } } } public virtual Dictionary Data { get => data; set => data = value; } public virtual bool Move(Vector2I pos) { if (!CanMove(pos)) { return false; } Pos = pos; on?.OnMove(this, pos); return true; } public abstract bool CanMove(Vector2I to); public override string ToString() { return $"{Name} at {pos}"; } }