Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何仅基于基本类型创建派生对象?_C#_.net_Inheritance - Fatal编程技术网

C# 如何仅基于基本类型创建派生对象?

C# 如何仅基于基本类型创建派生对象?,c#,.net,inheritance,C#,.net,Inheritance,例如,我有以下课程: public abstract class Device { public Device() { } public Device(XmlDevice xmlDevice) { // creating device by xmlDevice } } public class Modem : Device { public Modem() { } public Modem(

例如,我有以下课程:

public abstract class Device 
{
    public Device()
    {
    }

    public Device(XmlDevice xmlDevice)
    {
        // creating device by xmlDevice
    }
} 

public class Modem : Device
{
    public Modem()
    {
    }

    public Modem(XmlModem modem)
    {
        // creating modem by xmlModem
    }
}

public class Plc : Device
{
    public Plc()
    {
    }

    public Plc(XmlPlc plc)
    {
        // creating plc by xmlPlc
    }
}


public abstract class XmlDevice 
{
    public XmlDevice()
    {
    }
} 

public class XmlModem : XmlDevice
{
    public XmlModem()
    {
    }
}

public class XmlPlc : XmlDevice
{
    public XmlPlc()
    {
    }
}
我有一个包含XmlDevice对象的列表-如何根据其类型创建设备对象?我可以这样做:

foreach( xmlDevice in xmlDevicesList )
{
    if( xmlDevice is XmlModem )
        devicesList.Add( new Modem((XmlModem)xmlDevice) );
    else if( xmlDevice is XmlPlc )
        devicesList.Add( new Plc((XmlPlc)xmlDevice) );
}

但我想避免“是”语句和投射对象。这样做是否更干净?

您对当前实现的厌恶是有根据的。我可以向你保证,一旦你添加了新的设备类型,它就会崩溃。更糟糕的是,编译器无法知道您打算对实例类型进行彻底检查,因此无法通过发出错误信号来帮助您

如果可以更改
Xml*
类,只需在
XmlDevice
中引入一个抽象方法
CreateDevice
,并在派生类中重写它:

public abstract class XmlDevice
{
    // ...
    public abstract Device CreateDevice();
    // ...
}

public class XmlModem : XmlDevice
{
    // ...
    public override Device CreateDevice()
    {
        return new Modem(this);
    }
    // ...
}
现在,您可以简单地执行以下操作:

devicesList = xmlDevicesList.ConvertAll(x => x.CreateDevice());

这种方法的最大好处可能是编译器不会让您在不实现
CreateDevice
方法的情况下创建新的设备类型。

了解Factory design Pattern OK,但在Factory中,我也必须使用“is”和cast?请看我几年前对类似问题的回答:好的,谢谢。我会做得很好,你不需要工厂来做这件事。谢谢,这太简单了。。。如果我想将一些不同的参数(调制解调器和Plc的参数不同)传递给构造器,那么工厂是必要的?例如,什么参数?一些其他对象。例如:调制解调器天线和Plc输出模块