以下のサンプルプログラム:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericsTest
{
class Program
{
static void Main(string[] args)
{
IRetrievable<int, User> repo = new FakeRepository();
Console.WriteLine(repo.Retrieve(35));
}
}
class User
{
public int Id { get; set; }
public string Name { get; set; }
}
class FakeRepository : BaseRepository<User>, ICreatable<User>, IDeletable<User>, IRetrievable<int, User>
{
// why do I have to implement this here, instead of letting the
// TKey generics implementation in the baseclass handle it?
//public User Retrieve(int input)
//{
// throw new NotImplementedException();
//}
}
class BaseRepository<TPoco> where TPoco : class,new()
{
public virtual TPoco Create()
{
return new TPoco();
}
public virtual bool Delete(TPoco item)
{
return true;
}
public virtual TPoco Retrieve<TKey>(TKey input)
{
return null;
}
}
interface ICreatable<TPoco> { TPoco Create(); }
interface IDeletable<TPoco> { bool Delete(TPoco item); }
interface IRetrievable<TKey, TPoco> { TPoco Retrieve(TKey input); }
}
このサンプル プログラムは、私の実際のプログラムが使用するインターフェイスを表しており、私が抱えている問題を示しています ( でコメント アウトされていFakeRepository
ます)。このメソッド呼び出しが基本クラスによって一般的に処理されるようにしたいと考えています (私の実際の例では、それに与えられたケースの 95% を処理できます)。これにより、TKey の型を明示的に指定することにより、子クラスでのオーバーライドが可能になります。IRetrievable に使用するパラメーターの制約は問題ではないようです。メソッド呼び出しが基本クラスにフォールスルーすることはありません。
また、誰かがこの種の動作を実装し、最終的に探している結果を得る別の方法を見つけることができれば、それを見ることに非常に興味があります.
考え?