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输出模块