C# 从派生类调用返回基类实例

C# 从派生类调用返回基类实例,c#,inheritance,casting,C#,Inheritance,Casting,为了好玩,我正在编写一个通用的棋盘游戏类,可以根据各种游戏进行定制。它包括许多通用功能(填充单元格、旋转、翻转、应用移动列表等) 基类是泛型的,因此可以指定每个单元格应填充的内容 public class Board<T> { /* various usefule routines that return new instances of Board<T> */ } public类Board{/*返回Board的新实例的各种有用例程*/} 我从一个Tictatcoe游

为了好玩,我正在编写一个通用的棋盘游戏类,可以根据各种游戏进行定制。它包括许多通用功能(填充单元格、旋转、翻转、应用移动列表等)

基类是泛型的,因此可以指定每个单元格应填充的内容

public class Board<T> { /* various usefule routines that return new instances of Board<T> */ }
public类Board{/*返回Board的新实例的各种有用例程*/}
我从一个Tictatcoe游戏开始,宣布如下:

public enum TicTacMove { Empty, X, O };

public class TicTacToe : Board<TicTacMove> { /* ... */ }
公共枚举TicTacMove{Empty,X,O};
公共类TicTacToe:Board{/*…*/}
我遇到的麻烦是将这个由基例程返回的泛型版本转换回派生类——我就是做不到

当我尝试将基函数的值赋给派生类时,我得到:

错误CS0266无法将类型“BoardGames.Board”隐式转换为“BoardGames.TicTacToe.TicTacToe”。存在显式转换(是否缺少强制转换?)

所以,我显式地抛出它,这给了我一个InvalidCastException:

无法将类型为“BoardGames.Board`1[BoardGames.TicTacToe.TicTacMove]”的对象强制转换为类型为“BoardGames.TicTacToe.TicTacToe”

如果我的类持有可变数据,我可以简单地修改数据,而不用担心它;我的问题是如何通过返回一个新实例来实现这一点,这样每个实例都是不可变的

编辑: 例如,基类具有以下构造函数:

 public Board(Board<T> Source, IEnumerable<(int Index, T Value)> Changes)
公共板(板源,IEnumerable更改)

从派生类TicTacToe调用此构造函数并不会生成TicTacToe的新实例,而是生成Board的实例,该实例随后不能被转换回TicTacToe。

好吧,我找到了答案

由于不允许从基类强制转换回派生类,因此返回新实例的函数必须作为派生构造函数中的基类构造函数调用

为了简化,我在基类中创建了一个构造函数,它返回一个修改过的实例

在派生类中,我实现了一个私有构造函数,该构造函数接受要进行的更改列表。这有一个优点,那就是它几乎是样板

然后,每个派生类都能够调用自己类型的构造函数,然后该构造函数将工作传递给基类构造函数。这避免了我遇到的铸造问题

例如(前面的粗略伪代码)


您能否共享从何处获得此异常的代码?尝试将基函数的值分配给派生类是什么意思?您是否有可以添加的引发此异常的特定代码行?添加了另一个代码段
public abstract class BaseClass {
  protected BaseClass(BaseClass Source, var changes...) ...
}

public class DerivedClass {
  private DerivedClass(DerivedClass Source, var changes)
    : BaseClass(Source, changes) { }

public DerivedClass MakeChange(var change) {
  ...set up changed values...
  return new DerivedClass(this, changes)
  }
}