あなたの例では、2つの派生クラスの1つを作成し、それを基本変数に格納しています...継承の法則に従ってこれを行うのはまったく問題ないため、これはキャストをまったく必要としません。基本型変数には、より派生したオブジェクトをいつでも割り当てることができます。これは、基本クラスが実行できることはすべて、派生クラスも実行できることが保証されているため、安全です。たとえば、数学の教師は、通常の教師が実行できる任意のアクション(GradePapers()など)を実行できます。Teacher変数を使用してMathTeacherオブジェクトを指定するのが安全です。
BasePacket bp = (BasePacket) CreateNeededChildPacket();
編集:
コメントに応じて、理想的には、CreateNeededChildPacket()メソッドがBasePacketタイプを返すようにします(返されたオブジェクトが常にBasePacketから派生している場合)。基本パラメーターが派生オブジェクトを受け入れることができるのと同じように、基本戻り型は派生オブジェクトを返すことができます。これが継承の美しさです。これは、あなたのメソッドを呼び出す将来の誰かにとってはるかに安全です。
BasePacket CreateNeededChildPacket()
{
// do something
return AnyObjectThatDerivesFromBasePacket;
}
メソッドを更新できない場合は、安全のためにタイプチェックを追加することができます。
object obj = CreateNeededChildPacket();
BasePacket bp = null;
if (obj is BasePacket)
bp = (BasePacket) obj;
else
throw new Exception("Object was not a valid BasePacket type: " + obj.GetType.ToString());