覆盖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); }