首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写继承的泛型方法

重写继承的泛型方法
EN

Stack Overflow用户
提问于 2010-04-20 16:40:54
回答 3查看 38.9K关注 0票数 40

我在基类中有这个代码

代码语言:javascript
复制
 protected virtual bool HasAnyStuff<TObject>(TObject obj) where TObject:class 
  {
      return false;
  }

在孩子课上,我是压倒一切

代码语言:javascript
复制
protected override bool HasAnyStuff<Customer>(Customer obj) 
  {
    //some stuff
      if Customer.sth etc
      return false;
  }

我收到了这个错误

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

我在这里做错什么了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-20 16:43:22

不能在派生类中重写泛型方法的类型参数。要实现类似的功能,一种选择是让基类成为泛型类,并让派生类如

代码语言:javascript
复制
class Derived : BaseClass<Customer>
{
     protected override bool HasAnyStuff(Customer customer)
     {
         // ...
     }
}

其中BaseClass被声明为

代码语言:javascript
复制
class BaseClass<T> where T : class
{
    // ...
    protected virtual bool HasAnyStuff(T obj)
    {
         // ...
    }
}

或者,根据派生类的具体使用方式,您只需使用非泛型的HasAnyStuff参数覆盖Customer方法即可。

代码语言:javascript
复制
public bool HasAnyStuff(Customer customer)
{
    // ...
}

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

代码语言:javascript
复制
BaseClass foo = new DerivedClass();
foo.HasAnyStuff(new Customer());

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

票数 59
EN

Stack Overflow用户

发布于 2016-08-09 02:27:51

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

基类

代码语言:javascript
复制
protected virtual bool HasAnyStuff<TObject>(TObject obj)
{
    .... // base implementation
}

继承类

代码语言:javascript
复制
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
}
票数 6
EN

Stack Overflow用户

发布于 2016-05-10 21:04:07

我有你要找的那个用例。基类上有一个泛型方法,我只想为单个类型重写该方法。对于所有其他类型,我希望该方法的行为方式相同。下面是一个基于你的问题的简单例子。

代码语言:javascript
复制
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逻辑来处理多个不同类型的重写。

代码语言:javascript
复制
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);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2676940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档