重写继承泛型方法

问题描述:

我有这样的代码在基类重写继承泛型方法

protected virtual bool HasAnyStuff<TObject>(TObject obj) where TObject:class 
    { 
     return false; 
    } 

在子类中,我重写

protected override bool HasAnyStuff<Customer>(Customer obj) 
    { 
    //some stuff 
     if Customer.sth etc 
     return false; 
    } 

我收到此错误

“”'类型参数声明必须是不是类型的标识符'''

这是什么我在这里做错了?

您无法在派生类中重写泛型方法的类型参数。要实现类似的功能,一个选择是让你的基类是通用类,并有在那里BaseClass被声明为

class BaseClass<T> where T : class 
{ 
    // ... 
    protected virtual bool HasAnyStuff(T obj) 
    { 
     // ... 
    } 
} 

或者派生类,如

class Derived : BaseClass<Customer> 
{ 
    protected override bool HasAnyStuff(Customer customer) 
    { 
     // ... 
    } 
} 

,这依赖于如何使用派生类,您可以使用非泛型Customer参数覆盖HasAnyStuff方法。

public bool HasAnyStuff(Customer customer) 
{ 
    // ... 
} 

但请注意,如果你不使用的DerivedClass实例工作的新HasAnyStuff不会被调用。也就是说,

BaseClass foo = new DerivedClass(); 
foo.HasAnyStuff(new Customer()); 

将调用BaseClass的通用方法,而不是DerivedClass的非泛型方法。

我有同样的用例,你正在寻找。在基类中有一个通用的方法,我想重写只有一种类型的方法。对于所有其他类型,我希望该方法的行为方式相同。这是一个基于你的问题的简单例子。

class BaseClass 
{ 
    protected virtual bool HasAnyStuff<TObject>(TObject obj) 
    { 
     return false; 
    } 
} 

class DerivedClass : BaseClass 
{ 
    protected override bool HasAnyStuff<TObject>(TObject obj) 
    { 
     if (typeof(TObject) != typeof(AlarmTran)) return base.HasAnyStuff<TObject>(obj); 

     //some stuff 
     //if Customer.sth etc 
     return false; 
    } 
} 

您也可以反转if逻辑来处理多种不同类型的覆盖。

protected override bool HasAnyStuff<TObject>(TObject obj) 
{ 
    if (typeof(TObject) == typeof(AlarmTran)) 
    { 
     //some stuff 
     //if Customer.sth etc 
     return false; 
    } 
    else if (typeof(TObject) == typeof(...)) 
    { 
     ... 
     return ...; 
    } 

    return base.HasAnyStuff<TObject>(obj); 
} 

约翰·卡彭特的答案类似,您可以覆盖与同泛型方法泛型方法,而只是使用as运营商检查和它转换为所需的类型。这具有使用空测试来检查转换是否有效的附加好处。

基类

protected virtual bool HasAnyStuff<TObject>(TObject obj) 
{ 
    .... // base implementation 
} 

继承

protected override bool HasAnyStuff<TObject>(TObject obj) 
{ 
    var customer = obj as Customer; 
    if (customer == null) // conversion failed. object is not of type Customer 
    { 
     return base.HasAnyStuff(obj); 
    } 

    .... // do stuff with the customer 
}