使用派生 class 类型作为基础 class 的泛型操作的参数
Use derived class type as parameter of generic action of base class
我想通过一个委托来操作一个实例,它是 class 本身的一个 属性。委托的参数应该始终是实例本身(即使在派生的classes!)。
见下面的代码。我知道代码没有编译,因为我必须将 car1 强制转换为 car 类型,我正在寻找无需强制转换的解决方案。
代码
static void Main(string[] args)
{
var car = new Car();
car.VehicleManipulator = car1 => car1.SomeInt++;
car.ManipulateVehicle();
Console.WriteLine("end");
Console.ReadLine();
}
internal class Vehicle
{
public Action<Vehicle> VehicleManipulator { get; set; }
public void ManipulateVehicle()
{
this.VehicleManipulator(this);
}
}
internal class Car : Vehicle
{
public int SomeInt { get; set; }
}
编辑:
更改代码!
我的问题是,是否有一个很好的解决方案可以仅在基础 class 中处理所有这些问题,但在操作中我想使用派生的 classes 而无需强制转换。
你很接近。 car.ManipulateVehicle();
这一行得到 NullReferenceException
的原因是因为 VehicleManipulator
操作为空。
如您所见,基数 class 的 VehicleManipulator
属性 为空。
现在,如果您在分配操作时失败的行上方,它怎么可能为空?所以问题是在你派生的 class 汽车中,你有一个新的 different 属性 名称 VehicleManipulator
隐藏了基础的。因此,当您分配 car.VehicleManipulator
时,您实际上是在派生 class 中分配 属性 而不是在基础 class.
中
从 派生的 class 中删除它会起作用。
如果出于我尚不明白的原因,您确实希望在派生的 class 中保留 属性,那么在进行分配时,您可以指定要分配到基地 class 像这样:
如果您想避免转换,请将 Vehicle 通用化为:
class Vehicle<T> where T : Vehicle {
Action<T> ManipulateVehicle { get; set; }
}
class Car : Vehicle<Car> {
int SomeInt { get; set; }
}
它看起来有点奇怪,但这意味着如果你有一个汽车实例,那么操纵器可以在汽车上工作,如果你有一辆卡车,它可以在卡车上工作等等。车辆可能应该是抽象的。
我想通过一个委托来操作一个实例,它是 class 本身的一个 属性。委托的参数应该始终是实例本身(即使在派生的classes!)。
见下面的代码。我知道代码没有编译,因为我必须将 car1 强制转换为 car 类型,我正在寻找无需强制转换的解决方案。
代码
static void Main(string[] args)
{
var car = new Car();
car.VehicleManipulator = car1 => car1.SomeInt++;
car.ManipulateVehicle();
Console.WriteLine("end");
Console.ReadLine();
}
internal class Vehicle
{
public Action<Vehicle> VehicleManipulator { get; set; }
public void ManipulateVehicle()
{
this.VehicleManipulator(this);
}
}
internal class Car : Vehicle
{
public int SomeInt { get; set; }
}
编辑: 更改代码!
我的问题是,是否有一个很好的解决方案可以仅在基础 class 中处理所有这些问题,但在操作中我想使用派生的 classes 而无需强制转换。
你很接近。 car.ManipulateVehicle();
这一行得到 NullReferenceException
的原因是因为 VehicleManipulator
操作为空。
如您所见,基数 class 的 VehicleManipulator
属性 为空。
现在,如果您在分配操作时失败的行上方,它怎么可能为空?所以问题是在你派生的 class 汽车中,你有一个新的 different 属性 名称 VehicleManipulator
隐藏了基础的。因此,当您分配 car.VehicleManipulator
时,您实际上是在派生 class 中分配 属性 而不是在基础 class.
从 派生的 class 中删除它会起作用。
如果出于我尚不明白的原因,您确实希望在派生的 class 中保留 属性,那么在进行分配时,您可以指定要分配到基地 class 像这样:
如果您想避免转换,请将 Vehicle 通用化为:
class Vehicle<T> where T : Vehicle {
Action<T> ManipulateVehicle { get; set; }
}
class Car : Vehicle<Car> {
int SomeInt { get; set; }
}
它看起来有点奇怪,但这意味着如果你有一个汽车实例,那么操纵器可以在汽车上工作,如果你有一辆卡车,它可以在卡车上工作等等。车辆可能应该是抽象的。