我在基类中有这个代码
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;
}我收到了这个错误
‘类型参数声明必须是标识符,而不是类型’‘
我在这里做错什么了?
发布于 2010-04-20 16:43:22
不能在派生类中重写泛型方法的类型参数。要实现类似的功能,一种选择是让基类成为泛型类,并让派生类如
class Derived : BaseClass<Customer>
{
protected override bool HasAnyStuff(Customer customer)
{
// ...
}
}其中BaseClass被声明为
class BaseClass<T> where T : class
{
// ...
protected virtual bool HasAnyStuff(T obj)
{
// ...
}
}或者,根据派生类的具体使用方式,您只需使用非泛型的HasAnyStuff参数覆盖Customer方法即可。
public bool HasAnyStuff(Customer customer)
{
// ...
}但是,请注意,如果不使用HasAnyStuff实例,则不会调用新的DerivedClass。也就是说,
BaseClass foo = new DerivedClass();
foo.HasAnyStuff(new Customer());将调用BaseClass的泛型方法,而不是DerivedClass的非泛型方法。
发布于 2016-08-09 02:27:51
与John的答案类似,您可以使用相同的泛型方法覆盖泛型方法,但只需使用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
}发布于 2016-05-10 21:04:07
我有你要找的那个用例。基类上有一个泛型方法,我只想为单个类型重写该方法。对于所有其他类型,我希望该方法的行为方式相同。下面是一个基于你的问题的简单例子。
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);
}https://stackoverflow.com/questions/2676940
复制相似问题