【发布时间】:2011-08-01 12:41:13
【问题描述】:
我在将继承的类型转换为基类时遇到了一个基本问题。我知道这通常是不可能的,也就是说,您可以将派生类强制转换为其基类,但反之则不然。这是我正在努力解决的一个示例 sn-p:
假设我定义了一个抽象类来表示计算机 PCI 卡:
public abstract class PciDevice
{
public abstract int GetDeviceId();
public abstract String GetVendorName();
}
现在我创建了 3 种类型的继承类(设备):
public class GraphicsCard : PciDevice
{
public override int GetDeviceId() { return 1666; }
public override String GetVendorName() { return "CoolCorp"; }
int trianglesPerSecond;
ChipsetTypeEnum chipsetType;
}
public class AudioCard : PciDevice
{
public override int GetDeviceId() { return 1999; }
public override String GetVendorName() { return "ShinyCorp"; }
int numChannels;
int samplingRate;
}
public class Modem : PciDevice
{
public override int GetDeviceId() { return 1234; }
public override String GetVendorName() { return "BoringCorp"; }
public int baudRate;
bool faxEnabled;
}
现在,我在计算机内部定义了一个“插槽”:
public class PciCardSlot
{
private int slotId;
private int clockFreq;
private PciDevice cardInSlot;
public PciDevice getCard() { return cardInSlot; }
public void setCard(PciDevice card) { cardInSlot = card; }
}
我有一个插槽数组来表示计算机中的所有插槽:
PciCardSlot [] pciSlotsInComputer = new PciCardSlot[6];
然后,我定义了一个函数来检索一个 PciDevice 对象,给定一个插槽 id:
public PciDevice getInsertedCard(int slotId)
{
return pciSlotsInComputer[slotId].getCard();
}
到目前为止一切顺利。现在,在代码的某处,我实例化了 AudioCard、GraphicsCard 和 Modem 对象并将它们分配给插槽。
AudioCard a = new AudioCard();
Modem b = new Modem();
GraphicsCard c = new GraphicsCard();
PciCardSlot s0 = new PciCardSlot(); s0.setCard(a);
PciCardSlot s1 = new PciCardSlot(); s1.setCard(b);
PciCardSlot s2 = new PciCardSlot(); s2.setCard(c);
pciSlotsInComputer[0] = s0; pciSlotsInComputer[1] = s1; pciSlotsInComputer[2] = s2;
然后,我有一个如下所示的函数,用于对 Modem 对象进行操作:
public setBaudRateForModem(int slotId, int rate)
{
((Modem)getInsertedCard(slotId)).baudRate = rate; // Can not cast!!!
}
...
// I know that slot 1 contains a modem, so I do:
setBaudRateForModem(1, 9600);
上面的转换不起作用,因为我试图从 PciDevice 对象转换为从 PciDevice 派生的 Modem 对象。
我一直在阅读这方面的内容,几乎在我所看到的所有地方,人们似乎都认为,如果您需要将基类强制转换为成员类,那么您的设计就很糟糕。我的班级层次结构设计得很糟糕吗?有什么建议?感谢阅读。
【问题讨论】:
-
Can not cast!!!究竟是什么意思?如果您已经展示了大部分代码,继承层次结构是合理的,并且很可能问题是您将不是Modem的东西转换为Modem。你调试你的代码了吗? -
这看起来不错。您是否收到编译时错误或运行时错误?如果是运行时错误,那么您尝试转换的类型可能不是“调制解调器”。
标签: c# .net inheritance casting polymorphism