我有下面的代碼片段:如何在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')。 –