覆盖inheritance的generics方法

我在基类中有这个代码

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

在儿童class,我压倒一切

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

我收到了这个错误

”’类型参数声明必须是标识符而不是类型”’

我在这做错了什么?

您不能在派生类中覆盖generics方法的类型参数。 要实现类似的function,一个选项是让您的基类成为generics类,并使您的派生类如

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

其中BaseClass声明为

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

或者,根据您的派生类的确切使用方式,您可以使用非genericsCustomer参数覆盖HasAnyStuff方法。

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

但是,请注意,如果您不使用DerivedClass实例,则不会调用新的DerivedClass 。 也就是说,

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

将调用BaseClass的generics方法,而不是DerivedClass的非generics方法。

与John Carpenter的答案类似,您可以使用相同的generics方法覆盖generics方法,但只需使用as运算符检查并将其转换为所需类型。 这具有使用空值测试来检查转换是否有效的额外好处。

基类

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

inheritance类

 protected override bool HasAnyStuff(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 } 

我有同样的用例你正在寻找。 基类上有一个generics方法,我想只覆盖一个类型的方法。 对于所有其他类型,我希望该方法的行为方式相同。 这是一个基于您的问题的简单示例。

 class BaseClass { protected virtual bool HasAnyStuff(TObject obj) { return false; } } class DerivedClass : BaseClass { protected override bool HasAnyStuff(TObject obj) { if (typeof(TObject) != typeof(AlarmTran)) return base.HasAnyStuff(obj); //some stuff //if Customer.sth etc return false; } } 

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

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