c# - 构造函数中的基础对象作为向下转换的替代方法

标签 c# oop downcast

我有一个基本对象列表 (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 携带的附加信息。

引用 Jon Skeet 的例子你必须使用

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

如果您稍后想将 o 转换为 FileStream 对象。

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

相关文章:

c# - 为什么使用 WebRequest 发送 post 数据需要这么长时间?

c# - 在制作 Comparable 类(class)时遇到问题

c++ - 使用 Static_Cast 派生类指针指向基类对象

c# - 使用继承的自定义 IDataReader 从 IDbCommand 读取

c# - 在不失表现力的情况下从 Generic 中脱颖而出

c# - 如何从 AX 数据(容器)转换为 C# 集合

c# - GetLastWriteTime() 没有在我的页面上显示正确的日期时间

php - 如何获取未实例化的类(类外)的类名?

mysql - 在 PHP 类中访问数据库的最佳方法是什么?

c# - 处理类和 NHibernate 实体中的集合属性