作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想通过一个委托(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
操作为空。
如您所见,基类的 VehicleManipulator
属性为 null。
现在,如果在您分配操作时失败的行上方,它怎么可能为空?所以问题在于,在您的派生类 car 中,您有一个名为 VehicleManipulator
的新 different 属性,它隐藏了基类。因此,当您分配 car.VehicleManipulator
时,您实际上是在派生类中而不是在基类中分配属性。
从 derived class 中删除它会起作用。
如果出于某种我还无法理解的原因,您确实希望将属性保留在派生类中,那么在进行分配时,您可以指定要分配给基类,如下所示:
关于c# - 使用派生类类型作为基类泛型操作的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39036280/
我是一名优秀的程序员,十分优秀!