2016-07-19 10 views
1

私はthis oneに似た質問があります。次のように派生クラスとシャドーイングのソリューション

私の問題は、次のとおりです。

私は他のすべてのメッセージ

public class BaseMessage : ISpecificMessage1 
{ 
    public MsgType {get;set;} //enum 
    public abstract void read(BinaryReader br); 
    public abstract void write(BinaryWriter bw); 
}  

のための基本メソッドを提供し、私はこれらの基本的なメソッドをオーバーライドするクラスを派生しているいくつかの基本メッセージを持っています。すなわち、

public class MessageType1 : BaseMessage 
{ 
    public override void read(BinaryReader br) 
    { 
     //Do the read.. 
    } 
    public override void write(BinaryWriter bw) 
    { 
     //Do the write.. 
    } 
} 

私はレベル深くそのメソッドをオーバーライドする他の派生クラスを持って再び

public class MessageType1_Extended : MessageType1 
{ 
    public override void read(BinaryReader br) 
    { 
     //Do the read different to MessageType1.. 
    } 
    public override void write(BinaryWriter bw); 
    { 
     //Do the write different to MessageType1.. 
    } 
} 

現時点では私の問題は、私はメッセージパーサーを実行しているということである、と私は削除するために、静的メソッドを呼び出しますラッパーは、メッセージがあることとBaseMessageようなメッセージが返されたタイプを決定

public static BaseMessage extractMessage(byte[] msg) 
{ 
    //Remove header... get type... 
    switch(MsgType) 
    { 
      case type1_ext: 
       return new MessageType1_Extended() 
      //etc... 
    } 
} 

Iが抽出されたメッセージに.read()を呼び出し、クラス2つのより大きいレベルの深コールのみBaseMessage以上のレベルのメソッドを読み込みます。つまり、 MessageType1_extendedはMessageType1の読み取りを実行します。

私はこれが以前のリンクされた質問を読むことからなぜ起こっているのか理解していますが、私の質問はこれを回避する方法があるかどうかです。 タイプを型にハードキャストしないで、型にキャストして独自のoverrideメソッドを呼び出す方法はありませんか? ((MessageType1_extended)extractedMessage).read(); ??

ありがとうございました。

+0

あなたの質問は私には少し不明です。 'write()'の 'read()'と 'base.write()'に 'base.read()'がありますか? – ViRuSTriNiTy

+0

明確にするためにポストが更新されました。各クラスの読み書きはそれぞれ異なります – grant90

+0

正しいメソッドを呼び出すことができないコードを表示する必要があります。あなたがしていることはうまくいくはずです – pm100

答えて

0

Reflectionを使用して、正しいタイプのメソッドを動的に呼び出すことができます。

しかし、全体的な解決策が再設計のために熟しているということは私には襲いかかります。おそらく、独自の型の新しいインスタンスを返すために基本クラスを使用すべきではありません。あなたが解決しようとしている全体的な問題が何であるかという質問から私には完全にはっきりしませんが、Visitorパターンの実装が解析されたメッセージを生成する上でよりクリーンであるかどうかを検討するかもしれません。

多態性再帰を使用して、各クラスに基本クラスの抽出メソッドを呼び出し、値が返されるときに結果を構築することもできます。