重写继承泛型方法
问题描述:
我有这样的代码在基类重写继承泛型方法
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
}