【问题标题】:Inheritance from generic class with abstract property从具有抽象属性的泛型类继承
【发布时间】:2017-02-23 19:28:38
【问题描述】:

我试图让一个类继承自一个具有泛型属性的抽象类。我想我错过了一些真正重要的东西。我可以摆脱这个错误的唯一方法是摆脱基类中的构造函数。但是,如果我这样做,那么我的课程将缺乏目标。

错误

错误 CS7036 没有给出对应于 所需的形式参数'propA'...

基类

public abstract class BaseClass<T> where T:class
{
    public string propA{ get; set; }
    public int propB{ get; set; }
    public IEnumerable<T> propC { get; set; }

    public BaseClass(string propA, int propB, IEnumerable<T> propC)
    {
        this.propA = propA;
        this.propB = spropB; 
        this.propC = propC;
    }

    public abstract IEnumerable<T> Method1();

    public abstract string Method2();

    public abstract void Method3();
}

派生类

public class DerivedClass: BaseClass<SomeClass> 
{
    public override IEnumerable<SomeClass> Method1()
    {
        //Code Here
    }

    public override string GetDefaultSortField()
    {
         //Code Here
    }

    public override void SetSortParams()
    {
         //Code Here
    }
}

【问题讨论】:

  • 也许你应该使用接口而不是抽象基类(例如IBaseClass&lt;T&gt;)。然后你可以根据自己的需要设计构造函数。
  • 这与抽象类或泛型无关 - 这只是派生类中的默认构造函数调用基类中的构造函数而不传递参数的问题。你的基类可能是具体的和非泛型的,你仍然会遇到同样的问题。如果你打电话给new DerivedClass(),你想发生什么?您是否期望BaseClass 中的三参数构造函数被调用,如果是,您期望传递给它的参数是什么?
  • 借助 VS2015 F10 还可以帮助您自动创建派生构造函数
  • @JonSkeet 你是对的。我错过了 DerivedClass 中的构造函数。谢谢。

标签: c# asp.net oop inheritance abstract-class


【解决方案1】:

您的派生类中没有显式构造函数,因此它“继承”了基类的构造函数。但是基类构造函数有一个使用泛型类型 T 的参数,它没有在派生类中定义。如果将构造函数显式添加到派生类,应该没问题。 我的意思是这样的:

    public DerivedClass(string propA, int propB, IEnumerable<SomeClass> propC)
        : base(propA, propB, propC)
    {
    } 

请注意,这样IEnumerable&lt;SomeClass&gt; 在基类中变为IEnumerable&lt;T&gt;,因为泛型类型参数T 绑定到DerivedClass 中的SomeClass

【讨论】:

    【解决方案2】:

    您错过了DerivedClass 中的constructor。但是由于基类中的默认构造函数包含三个参数,因此您需要调用匹配的基构造函数。因此,将此构造函数添加到DerivedClass,它将解决您的问题:

    public DerivedClass(string propA, int propB, IEnumerable<SomeClass> propC) 
          : base(propA, propB, propC)
    {
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2012-04-11
      • 2021-07-05
      • 2014-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多