C++ のバックグラウンドを持っているので、ジェネリック型の特定のインスタンスに基づくオーバーロードで問題が発生しました。Foo<T>
クラスのコードのインスタンスが 1 回しか生成されないため、次のコードは機能Method
しthis
ませFoo<T>
ん。C++ では、テンプレートが一意の型としてインスタンス化されることに慣れています。Foo<A>
Foo<B>
using System.Collections.Generic;
class A
{
// Concrete class
}
class B
{
// Concrete class
}
class Bar
{
public void OverloadedMethod(Foo<A> a) {} // do some A related stuff
public void OverloadedMethod(Foo<B> b) {} // do some B related stuff
public void OverloadedMethod(OtherFoo of) {} // do some other stuff
public void VisitFoo(FooBase fb) { fb.Method(this); }
}
abstract class FooBase
{
public abstract void Method(Bar b);
}
class Foo<T> : FooBase
{
// Class that deals with As and Bs in an identical fashion.
public override void Method(Bar b)
{
// Doesn't compile here
b.OverloadedMethod(this);
}
}
class OtherFoo : FooBase
{
public override void Method(Bar b)
{
b.OverloadedMethod(this);
}
}
class Program
{
static void Main(string[] args)
{
List<FooBase> ListOfFoos = new List<FooBase>();
ListOfFoos.Add(new OtherFoo());
ListOfFoos.Add(new Foo<A>());
ListOfFoos.Add(new Foo<B>());
Bar b = new Bar();
foreach (FooBase fb in ListOfFoos)
b.VisitFoo(fb);
// Hopefully call each of the Bar::Overloaded methods
}
}
このようなものを C# で動作させる方法はありますか? Foo のコードを、使用したい型ごとに個別のクラスとして複製する必要はありません。
編集:うまくいけば、これはもう少し明確です。