次のコード スニペットがあります。
interface IRepositoryBase<BackupType> where BackupType : IBackup {
IEnumerable<BackupType> Backups { get; set; }
void Delete(BackupType backup);
BackupType GetOrCreateBackup(IFileSource source);
}
interface IRepository : IRepositoryBase<IBackup> {
}
interface IRepository<BackupType> : IRepository, IRepositoryBase<BackupType> where BackupType : IBackup {
}
基本的に私が持っている要求は、いくつかの IRepository<BackupType> をコレクションに入れたい場合に備えて、任意の IRepository<BackupType> を IRepository に置き換えることができるようにしたいということです (したがって、コレクションのタイプを指定できます)。それに加えて、IRepository<BackupType> が IRepository から継承されていると仮定するのは合理的で論理的だと思われます (その逆ではありません)。また、私は間違いなく IRepository に IRepository<BackupType> のすべてのプロパティとメソッドを持たせたいと思っています (唯一の違いは非ジェネリックとジェネリックです)。
残念ながら、コンパイラはコードで次のエラーを出します:
IRepository<BackupType> cannot implement both IRepositoryBase<IBackup> and IRepositoryBase<BackupType> because they may unify for some type parameter substitutions
したがって、このエラーを解消する他のコードを使用して再試行します (IRepositoryBase<> インターフェイスはなくなりました)。
interface IRepository {
IEnumerable<IBackup> Backups { get; set; }
void Delete(IBackup backup);
IBackup GetOrCreateBackup(IFileSource source);
}
interface IRepository<BackupType> : IRepository where BackupType : IBackup {
new IEnumerable<BackupType> Backups { get; set; }
void Delete(BackupType backup);
new BackupType GetOrCreateBackup(IFileSource source);
}
今、私はこれらの醜い「新しい」ものをそこに持っています. さらに、IRepository<BackupType> を実装すると、最初のプロパティを「new」で隠したにもかかわらず、コンパイラは両方の「Backups」プロパティを実装する必要があるようです。
誰かがこれを適切に行う方法を教えてもらえますか? :)