2016-10-14 4 views
1

Ich versuche, eine Klasse erben von einer abstrakten Klasse mit einer generischen Eigenschaft darin. Ich denke, ich vermisse etwas wirklich Wichtiges. Der einzige Weg, wie ich diesen Fehler loswerden kann, ist, den Konstruktor in der Basisklasse loszuwerden. Aber wenn ich das täte, würde meine Klasse keinen Sinn haben.Vererbung von generische Klasse mit abstrakten Eigenschaft

Fehler

Fehler CS7036 Es gibt kein Argument gegeben, die erforderlichen formalen Parameter 'propA' ...

Base Class

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(); 
} 
entspricht zum

Abgeleitete Klasse

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

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

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

Vielleicht anstelle der abstrakten Basisklasse sollten Sie Schnittstelle verwenden (z. B. 'IBaseClass '). Dann können Sie Konstrukteure basierend auf Ihren Anforderungen entwerfen. – Jure

+6

Dies hat nichts mit abstrakten Klassen oder Generika zu tun - es ist einfach eine Frage eines Standardkonstruktors in einer abgeleiteten Klasse, der einen Konstruktor in der Basisklasse aufruft und keine Argumente übergibt. Ihre Basisklasse könnte konkret und nicht-generisch sein und Sie hätten immer noch das gleiche Problem. Was möchten Sie tun, wenn Sie 'new DerivedClass()' aufrufen? Erwarten Sie, dass der Drei-Parameter-Konstruktor in 'BaseClass' aufgerufen wird, und wenn ja, welche Argumente erwarten Sie, dass er an ihn übergeben wird? –

+0

Mit VS2015 hilft Ihnen F10 auch bei der automatischen Erstellung dieses abgeleiteten Konstruktors. –

Antwort

4

Sie keinen expliziten Konstruktor in der abgeleiteten Klasse, so ist es erbt "den Konstruktor der Basisklasse. Der Basisklassenkonstruktor hat jedoch einen Parameter, der einen generischen Typ T verwendet, der in der abgeleiteten Klasse nicht definiert ist. Wenn Sie der abgeleiteten Klasse explizit einen Konstruktor hinzufügen, sollte dies in Ordnung sein. Ich meine so:

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

Beachten Sie, dass auf diese Weise die IEnumerable<SomeClass>IEnumerable<T> in der Basisklasse wird, wie der generische Typparameter T auf SomeClass in DerivedClass gebunden ist.

2

Sie haben die constructor im DerivedClass verpasst. Aber da der Standardkonstruktor in der Basisklasse drei Parameter enthält, müssen Sie den passenden Basiskonstruktor aufrufen. So fügen Sie diesen Konstruktor zum DerivedClass und es wird Ihr Problem lösen:

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