ジェネリックスを使用すると、これをかなり簡単に行うことができますが、コードはどこかで処理され、IEntity
コンパイル時に基になるジェネリック型について知らないと思います。もしそうなら、あなたはそのように2つのインターフェースを宣言することができます:
public interface IEntity<T> : IEntity
{
new T GetThis();
}
public interface IEntity
{
object GetThis();
}
次に、次のCar
ようになります。
public class Car : ICar, IEntity<ICar>
{
public ICar GetThis()
{
Console.WriteLine("Generic GetThis called");
return this;
}
object IEntity.GetThis()
{
Console.WriteLine("Non-generic GetThis called");
return this;
}
}
これは明示的なインターフェイスの実装を使用するため、呼び出し元のコードがそれが(というよりも)であることがわかっている場合は、汎用バージョンを利用します。それがそれをとしてのみ知っている場合、それは非ジェネリックバージョンを活用します。Car
IEntity<ICar>
IEntity
したがって、これを活用する可能性のあるいくつかのコード:
public static T SomeMethod<T>(IEntity<T> entity)
{
T target = entity.GetThis(); //Generic GetThis called
return target;
}
public static object SomeNonGenericMethod(IEntity entity)
{
object target = entity.GetThis(); //Non-generic GetThis called
return target;
}
Car car = new Car();
ICar icar = SomeMethod<ICar>(car);
IEntity someEntity = new Car();
object obj = SomeNonGenericMethod(someEntity);