Вы можете иметь целый длинный список if / else или переключателя
if (item is ChatPacket)
{
// cast
}
else if (...)
{
// cast
}
else ...
Однако это может стать громоздким.
Возможно, вы захотите вернуться к дизайну вашего класса. Имея List<Packet>
, вы фактически заявляете , что вас не волнует разница между производными дочерними элементами , по крайней мере, с точки зрения их уникальных API.
Другими словами, если ваш дизайн
class Packet { public void Foo() { } }
class ChatPacket : Packet { public void Bar() { } }
Вы говорите, что заботитесь только о возможности доступа Foo()
.
Если вы действительно заботитесь о различиях, возможно, вы можете выразить эти различия с помощью полиморфизма с помощью абстрактных или виртуальных методов в базовом и переопределенном поведении детей. Поэтому у вас все еще есть коллекция базовых классов, но вы по-прежнему получаете пользовательское поведение, указанное каждым дочерним классом.
class Packet { public virtual void Foo() { } }
class ChatPacket : Packet { public override void Foo() { } }
Здесь вы звоните, просто позвоните Foo()
. Не требуется литье.