の一般的な派生クラスへの一般的な訪問者を適用しますそのオブジェクトにVisit
関数は、正しい汎用的なインスタンス化を使用して?私は、その答えはおそらく、オブジェクトが、基底から派生した他の型ではないことを確認するために、型チェックされた動的なダウンキャストを必要とすることを理解しています。私は答えが反映されていると仮定していますが、これはまた問題ありません。反射がなくてもそれを行う方法があれば好きです。は現在、私はこのような何かを持っている非ジェネリック基底クラス
回答に抽象メソッドBase
とDerived
が含まれていても問題ありません。私はそれを追加するクラスを十分にコントロールしています。しかし、終わりには、DerivedタイプのT
で正しくインスタンス化された汎用関数を呼び出す必要があります。
申し訳ありませんが、これは簡単な質問です。私はC++のバックグラウンドから来ています。私の本能はCRTPやそれ以外のものを使うことです。これはC#では不可能です。
EDIT:
ここで私が行うことができるために必要なものの例です:
(わかりやすくするために編集)Base GetSomeDerivedInstance() { ...; return new Derived<...>(); }
var b = GetSomeDerivedInstance();
// This is the line that needs to work, though it doesn't necessarily
// need to have this exact call signature. The only requirement is that
// the instantiated generic is invoked correctly.
Visitor.Visit(b);
正確にはわかりませんが、一般的な制約を探していると思います。https://msdn.microsoft.com/en-us/library/d5x73970.aspx –
コードはそのまま使用する必要があります。 'public class Foo:Base {}; Visitor.Visit(new Derived ()); 'うまくコンパイルできます。 –
Jacob
ヤコブ:正確ではありません。私はもっと次のようなことをしようとしています: 'Base b = createDerived(); Visitor.Visit(b); ' – Lucretiel