我偶尔会遇到类的设计问题,主要是在一些视频游戏中。当扩展另一个类(例如
Player
)的类的字段同时也是具有自己的扩展类的类时,就会出现问题。我知道这是一个模式问题,但不知道如何正确解决它。
让我们举一个超级简单的例子。
public class Engine {
public void Drive() {}
}
public class Engine : SpecialEngine {
public void Charge() {}
}
public class Car {
protected Engine engine;
public virtual void Move(){
this.engine.Drive();
}
}
public class SpecialCar : Car {
// Both SpecialCar.engine and SpecialCar.specialEngine
// would need to be set to an instance of SpecialEngine
private SpecialEngine specialEngine;
public override void Move(){
// or.. cast this.engine to SpecialEngine?
this.specialEngine.Charge();
base.Move();
}
}
Car
有一个 Engine
,你可以将 SpecialEngine
传递给 Car
(不知道 C# 使用术语“切片”,但这至少在 C++ 中有效)。但您无法访问 SpecialEngine
的任何属性。因此,您创建的 SpecialCar
可以接受 SpecialEngine
作为其 engine
,但您想要访问 SpecialEngine
,因此您创建了第二个名为 specialEngine
的字段,现在有两个对其的引用?
我的想法是错误的,我不知道我应该做什么。我知道我可能有一个通用的
Car<T>
但我觉得我最终可能会得到 Car<A, B, C, D...>
C# 支持协变返回。只能在
SpecialEngine
中使用单个 SpecialCar
。
namespace CovariantReturnType
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello, World!");
}
}
public class Engine
{
public void Drive() { }
}
public class SpecialEngine : Engine
{
public void Charge() { }
}
public class Car
{
protected virtual Engine Engine { get; }
public virtual void Move()
{
Engine.Drive();
}
}
public class SpecialCar : Car
{
protected override SpecialEngine Engine { get; }
public override void Move()
{
Engine.Charge();
base.Move();
}
}
}