假设有一个通用的List类型的Packet,持有自定义类扩展Packet, 例如登录包 or 聊天包.
假设我把这些放在一个列表中。当我把它们拿出来时,最“具体”的类型是Packet。我想将它们转换成更具体的类型,回到原来的类型登录包 or 聊天包或者回到他们原来的类型。
问题:我该怎么做?
参考:如何在运行时以编程方式转换对象? https://stackoverflow.com/questions/1829605/how-to-cast-an-object-programmatically-at-runtime
那么...似乎如果这些自定义类共享一个通用接口,就可以解决转换问题吗?但如果是这样,我的类就不能共享一个接口。我需要在接口上构建接口,在类上构建类。那么...我该怎么做呢?抱歉,如果这个问题不太准确。不知道如何阐明我的确切问题。
You could有一长串 if/else 或 switch
if (item is ChatPacket)
{
// cast
}
else if (...)
{
// cast
}
else ...
然而,这可能会变得难以处理。
您可能希望重新审视您的课程设计。通过拥有List<Packet>
,你有效地陈述了你不关心派生子项之间的差异,至少就其独特的 API 而言。
换句话说,如果你的设计是
class Packet { public void Foo() { } }
class ChatPacket : Packet { public void Bar() { } }
你是说你只关心能够访问Foo()
.
If you do关心差异,也许您可以通过子级的基本行为和重写行为中的抽象或虚拟方法来用多态性来表达这些差异。因此,您仍然拥有基类的集合,但您仍然可以获得每个子类指定的自定义行为。
class Packet { public virtual void Foo() { } }
class ChatPacket : Packet { public override void Foo() { } }
在这里,你打电话就打电话Foo()
。无需铸造。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)