私は、次の操作を実行しようとしている:動的ディスパッチング
public abstract BaseClass {
public virtual void ReceiveEvent(Event evt)
{
ProcessEvent(evt as dynamic);
}
private void ProcessEvent(object evt)
{
LogManager.Log(@"Received an event that is not being processed!
Dispatch fallback");
}
}
public DerivedClass: BaseClass {
private void ProcessEvent(SpecificEvent evt)
{
LogManager.Log("Processing Event");
}
}
SpecificEventsは、フォールバック方式の代わりに、派生クラスで1を押してください。私はいつも同じクラス内の動的ディスパッチを使用して、それが本当に有用であるか/きれいであることを見いだします。上記の例に示すように派生クラスではうまくいかないでしょうか?
編集: 回答には多少の混乱があるようです。
public class SomeClass{
public void DoSomethingDispatcher(SomeObject obj)
{
ProcessObject(obj as dynamic);
}
private void DoSomething(SomeObjectType1 obj)
{
}
private void DoSomething(SomeObjectType2 obj)
{
}
private void DoSomething(SomeObjectType3 obj)
{
}
private void DoSomething(object obj) //fallback
{
}
}
あなたは事前に正確な型を知らないとあなたは大きなswitch文を使用しないとき
のための素晴らしい作品:基本的に私は次のデザインのすべての時間を使用します。基本クラスがフォールバックメソッドを保持し、派生クラスがすべてのより具体的なメソッドを保持する継承でこれを実装できるかどうかは不思議です。
私の推測では、ReceiveEventがDerivedClassではなくBaseClassで呼び出されていると思います。 DerivedClassでReceiveEventをオーバーライドしようとしましたか?これは仮想的なので、 'public override void ReceiveEvent(Event evt)'を実行することができます。バーチャルメソッドの詳細は、次のとおりです。http://msdn.microsoft.com/en-us/library/aa645767%28v=vs.71%29 aspx – Davio