我有一个基本对象(RTUDevice)的列表,想要遍历并将每个对象转换为派生对象(实际上是派生RTDSensor的派生对象),但是向下转换会引发错误。

public RTUDevice(int id)
{
    _id = id;
}

public class RTDDevice : RTUDevice
{
    public RTDDevice(int id)
        : base(id)
    {

    }
}

public class RTDSensor : RTDDevice
{
    public RTDSensor(int id)
        : base(id)
    {

    }
}

RTDSensor return = (RTDSensor)_devices.Find(d => d.Id == p.ReturnId);


将构造函数中的基础对象传递给RTDSensor会更好吗

public RTDSensor(RTUDevice rtu) : base(rtu.Id)
{
}


还是我的OOP设计方式出乎意料。

最佳答案

问题可能出在您将设备添加到_devices集合中的方式上。

例如:

RTDSensor sensor = new RTDSensor(1);
_devices.Add(sensor);
RTDSensor retrievedSensor = (RTDSensor)_devices.Find(d => d.Id == 1);


应该管用。但是,如果将传感器添加为RTUDevice对象,则之后无法将其强制转换为RTDSensor,因为它没有RTDSensor附带的其他信息。

参考乔恩·斯凯特的例子,您必须使用

object o = new FileStream(path, filemode);
FileStream fs = (FileStream)o;


如果以后想将o强制转换为FileStream对象。

关于c# - 构造函数中的基础对象可以替代向下转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1198984/

10-10 14:36