我有下面的代码片段:如何在C#中正确地使用非泛型对象来设计泛型接口?
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,万一请求我想提出一些IRepository <BackupType>成集合(这样我可以指定集合的类型)。除此之外,假设从IRepository继承IRepository <BackupType>似乎是合理和合乎逻辑的(而不是其他方式)。我也肯定要IRepository拥有的所有属性和IRepository < BackupType的方法>(唯一的区别在于非通用VS通用)
不幸的是,编译器为与代码以下错误:
IRepository<BackupType> cannot implement both IRepositoryBase<IBackup> and IRepositoryBase<BackupType> because they may unify for some type parameter substitutions
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);
}
现在我H:
所以我与其他一些代码从而消除这个错误(IRepositoryBase < >界面消失)再试一次把这些丑陋的“新”放在那里。此外,在实施IRepository <BackupType>后,编译器似乎仍希望实现“备份”属性,尽管我用“新”隐藏了第一个属性。
有人能告诉我如何正确地做到这一点? :)
你应该用'T'开始你的泛型类型,例如'TBackup'(或者,因为你的界面只有一种类型,只需'T'),而不是'BackupType',以遵循.NET通用类型命名标准。 –
您应该注意,像'List''用'Add(object)'方法扩展'IList',您可能无法始终满足'IRepository'接口的更一般参数。如果它传递了错误的值,它可能必须抛出一个异常。如果你使用一组'IRepository'的唯一方法是将它们取出来,你可以制作一个[covariant](http://msdn.microsoft.com/en-us/library/dd799517。 (''out')接口('Backups'和'GetOrCreateBackup')和一个反向('in')接口(''Delete')。 –