gpt4 book ai didi

c# - 使用派生类类型作为基类泛型操作的参数

转载 作者:行者123 更新时间:2023-11-30 20:19:16 25 4
gpt4 key购买 nike

我想通过一个委托(delegate)来操作一个实例,这是类本身的一个属性。委托(delegate)的参数应该始终是实例本身(即使在派生类中!)。

请参阅下面的代码。我知道代码没有编译,因为我必须将 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; }
}

编辑:更改代码!

我的问题是,是否有一个好的解决方案可以仅在基类中处理所有这些问题,但在操作中我想使用派生类而不进行强制转换。

最佳答案

你很接近。对于这一行 car.ManipulateVehicle();,您得到 NullReferenceException 的原因是因为 VehicleManipulator 操作为空。

enter image description here

如您所见,基类的 VehicleManipulator 属性为 null。

现在,如果在您分配操作时失败的行上方,它怎么可能为空?所以问题在于,在您的派生类 car 中,您有一个名为 VehicleManipulator 的新 different 属性,它隐藏了基类。因此,当您分配 car.VehicleManipulator 时,您实际上是在派生类中而不是在基类中分配属性。

derived class 中删除它会起作用。

如果出于某种我还无法理解的原因,您确实希望将属性保留在派生类中,那么在进行分配时,您可以指定要分配给基类,如下所示:

enter image description here

关于c# - 使用派生类类型作为基类泛型操作的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39036280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com