我有一个基类 Building,它是抽象的并且包含一个 BuildingSO 属性。我希望这个属性被一些子类覆盖,像这样:
从一个类似的问题(Override property of the base class with a derived class)我意识到我可以通过这样做来使用泛型:
public class Building<T> where T: BuildingSO {
public T BuildingSO { get; set; }
}
public class SpawningSO : Building<SpawningSO> {
}
但这似乎有点冗长,因为每次我在任何其他类中引用 Building 类时,我都必须显式声明属性类型:
private Building<BuildingSO>> building;
此外,根据项目的组织方式,在我看来它可能会导致 BuildingSO/SpawningBuildingSO 命名空间与引用 Building 的所有其他模块之间的耦合。
所以我想知道是否还有另一种解决方案,特别是因为我从处理非抽象基类的问题中得到了答案。我想知道我的基类是抽象的这一事实是否可以以某种方式允许更灵活的解决方案。
编辑:另外,我正在使用 Unity 游戏引擎,我刚刚了解到另一个我不能使用这种泛型方法的原因:Unity 不支持从 MonoBehaviour 继承的泛型类,在我的示例中,Building 必须继承自单一行为。
首先,这种具体的方法是行不通的,因为
SpawningBuilding : Building<SpawningSO>
不是 Building<BuildingSO>
并且您将无法将前者的实例分配给后者 - 这里解释了原因。如果您愿意将该属性设置为只读 - 您可以利用 C# 9 中引入的 covariant returns:
public class BuildingSO
{
}
public class SpawningSO : BuildingSO
{
}
public class Building
{
public virtual BuildingSO BuildingSO { get; }
}
public class SpawningBuilding :Building
{
public SpawningBuilding(SpawningSO buildingSo)
{
BuildingSO = buildingSo;
}
public override SpawningSO BuildingSO { get; }
}
还有用处: