c#泛型类的具体覆盖

时间:2012-06-14 13:35:07

标签: c# .net generics inheritance subtype

这是我正在使用的通用类:

 public interface IRepository<T> where T : EntityObject
{
    RepositoryInstructionResult Add(T item);
    RepositoryInstructionResult Update(T item);
    RepositoryInstructionResult Delete(T item);
}
public class Repository<T> : IRepository<T> where T : EntityObject
{

    RepositoryInstructionResult Add(T item)
    { //implementation}
    RepositoryInstructionResult Update(T item);
    { //implementation}
    RepositoryInstructionResult Delete(T item);
    { //implementation}
 }

现在我想在t:特定类型时偶尔改变方法的行为。 是否有类似以下内容? 此特定尝试会产生错误(错误5:“存储库”的部分声明必须具有相同顺序的相同类型参数名称。)

public class Repository<Bar> //where Bar : EntityObject
{
    RepositoryInstructionResult Add(Bar item)
    { //different implementation to Repository<T>.Add() }
    //other methods inherit from Repository<T>
 }

4 个答案:

答案 0 :(得分:6)

public class BarRepository : Repository<Bar>
{ 
    RepositoryInstructionResult Add(Bar item) 
    { //different implementation to Repository<T>.Add() } 
    //other methods inherit from Repository<T> 
} 

答案 1 :(得分:0)

将您的Repository类命名为RepositoryBase并使接口方法成为虚拟。 在RepositoryBase类中以一般方式实现它们,但是因为你将方法标记为虚拟u将能够覆盖派生类中的功能,所以代码看起来就像这样。

 public interface IRepository<T> where T : EntityObject
 {
    RepositoryInstructionResult Add(T item);
    RepositoryInstructionResult Update(T item);
    RepositoryInstructionResult Delete(T item);
 }

 public class Repository<T> : IRepository<T> where T : EntityObject
 {
    virtual RepositoryInstructionResult Add(T item)
    { //implementation}
    virtual RepositoryInstructionResult Update(T item);
    { //implementation}
    virtual RepositoryInstructionResult Delete(T item);
    { //implementation}
  }

如果需要为Bar Object的更新方法执行一些自定义逻辑,只需创建派生类名称BarRepository并覆盖Repositorybase类的更新方法,您可以调用基本实现或只使用其自己的逻辑进行处理

 public class BarRepository : Repositorybase<Bar>
 {
    public override RepositoryInstructionResult Update(Bar item);
    {
       //Call base method if needed
       //Base.Update(item);

       //implement your custom logic here
    }
  }

答案 2 :(得分:0)

作为您问题的直接答案:与您所展示的最接近的事情是在运行时检查T的实际值。在你的add方法中,你可以这样写:

if (typeof(T) == typeof(Bar)) {
    // your Bar-specific code
}
// ...

请注意,这在性能方面可能不是很好,特别是如果您想要区别对待多于一种或两种此类特殊类型。

除此之外,唯一的解决方案是一个子类,它指定基类的实际类型参数,如其他答案中所述。

答案 3 :(得分:0)

使用扩展方法:

public static void DoSomething(this repository<Bar> repo)
{
  //your custom code goes here
}