2016-04-21 9 views
-4

Ich habe eine DDD-Typ-Lösung mit "Domain-Modell" -Klassen, die unter Verwendung einer "DTO" -Klasse (d. H. Rohdaten aus DB) konstruiert werden.Wenn die abstrakte Basisklasse einen parametrisierten Konstruktor enthält (und abgeleitet nicht), warum kann er nicht verwendet werden?

Die Domänenmodellklassen erben alle von einer abstrakten Basisklasse, die zum generischen Injizieren/Abrufen der DTO-Daten dienen soll. Hier ist ein Beispiel:

public abstract class DomainModelBase<T> where T : IDto, new() 
{ 
    protected T _data; 

    protected DomainModelBase() 
    { 
     _data = new T(); 
    } 

    protected DomainModelBase(T data) 
    { 
     _data = data; 
    } 

    protected void SetData(T data) 
    { 
     _data = data; 
    } 

    public T GetData() 
    { 
     return _data; 
    } 
} 

public class AttributeOption : DomainModelBase<AttributeOptionData> 
{ 
    //public AttributeOption(AttributeOptionData data) 
    //{ 
    // SetData(data); 
    //} 
} 

Ich dachte (weil DomainModelBase eine parametrisierte Konstruktor enthält) ich, dies zu tun wäre in der Lage:

 var data = new AttributeOptionData(); 
     var model = new AttributeOption(data); 

jedoch der Compiler sagt „Constructor 'AttributeOption' hat null Parameter , wird aber mit einem Argument aufgerufen ". Die einzige Möglichkeit, es zum Laufen zu bringen, scheint darin zu bestehen, einen parametrisierten Konstruktor in der abgeleiteten Klasse zu erzeugen (wie die oben genannte auskommentierte).

Gibt es eine Möglichkeit, dies durch Ändern der Basisklasse, d. H. Ohne die Arbeit parametrisierten Konstruktoren in jeder abgeleiteten Klasse einrichten zu machen?

+0

Konstruktoren werden nicht vererbt. Siehe das markierte Duplikat für Stack Overflow-Zitat und natürlich die C# -Dokumentation und die Spezifikation für offizielle Zitate. Dies wird in den Sprachhandbüchern, Referenzen usw. deutlich beschrieben. –

Antwort

0

Nein, das geht nicht.

Es ist eine Einschränkung, die besagt, dass jede abgeleitete Klasse (implizit oder explizit) mindestens einen Konstruktor aus der Basisklasse verwenden soll.

In Ihrem Beispiel hat Ihre untergeordnete Klasse implizit einen parameterlosen Konstruktor, der implizit parameterlosen Konstruktor aus der Basis verwendet.

Sie müssen also entweder parametrisierten Konstruktor in jeder abgeleiteten Klasse einrichten oder diesen Konstruktor aus der Basisklasse delelieren.

Oder Sie können so etwas versuchen:

public class AttributeOption : DomainModelBase<AttributeOptionData> 
{ 
    public AttributeOption(AttributeOptionData data) : base(data) { } 
} 

Das ist nicht das, was Sie genau wollen, aber das, was wir haben.

Verwandte Themen