2016-06-30 11 views
1

Ich habe eine ElternklasseFehler beim Konstruktor in abgeleiteten Klasse

abstract class ClassPlugin 
{ 
    public ClassPlugin(eGuiType _guyType) 
    { 
     GuiType = _guyType; 
    } 
    public eGuiType GuiType; 

    public void Action() { } 
} 

Ich möchte, dass alle abgeleiteten Klassen, das Aktionselement implementieren und die guyType Feld zu definieren. Um das zu tun, habe ich es in den Konstruktor gebracht, das ist die einzige Möglichkeit, die mir in den Sinn kommt. daher eine abstrakte Klasse kann sein:

class ClassStartWF: ClassPlugin 
{ 
    public ClassStartWF(eGuiType _guyType) 
    { 
     GuiType = _guyType; 
    } 

    public void Action() 
    { 
     MessageBox.Show(GetType().Name); 
    } 
} 

das Problem ist, dass ich den Fehler:

Severity Code Description Project File Line Suppression State Error CS7036 There is no argument given that corresponds to the required formal parameter '_guyType' of 'MainWindow.ClassPlugin.ClassPlugin(MainWindow.eGuiType)'

Antwort

3

Sie sollten die Basisklassenkonstruktor in abgeleiteten Klasse Konstruktor aufrufen. Da Sie einen Konstruktor erstellt haben, generiert der Compiler keinen Standardkonstruktor für Ihre Klassen.

public ClassStartWF(eGuiType _guyType) 
    : base(_guyType) 
{ 
    // GuiType = _guyType; //this is not needed since the value is assigned in the base class constructor 
} 
1

Zwei Probleme ...

Zuerst müssen Sie den Basisklassenkonstruktor aus dem abgeleiteten Typ nennen, da die Basis kein Standardkonstruktor hat:

public ClassStartWF(eGuiType _guyType) : base(_guyType) 
{ 
} 

Da die Basisklasse kümmert sich um die Einstellung des Feldes, das Sie nicht tun müssen.

Zweitens sollten Sie Action abstrakt in der Basisklasse machen und es dann in der abgeleiteten Klasse überschreiben:

abstract class ClassPlugin 
{ 
    public abstract void Action(); 
} 

class ClassStartWF: ClassPlugin 
{ 
    public ClassStartWF(eGuiType _guyType) 
    { 
     GuiType = _guyType; 
    } 

    public override void Action() 
    { 
     MessageBox.Show(GetType().Name); 
    } 
} 

Im Moment Sie Action anruft, wird nicht auf die abgeleiteten Instanzen versenden, wenn sie durch ein angerufenes Basisreferenz.

Auch anstatt GuiType eine öffentliche Variable machen würden Sie besser dran, es eine Eigenschaft machen:

public eGuiType GuiType{get; set;} 

Dieses Sie eine gewisse Kontrolle über den Wert geben. Außerdem sollten Sie in Betracht ziehen, den Setter privat zu machen, wenn er nur während der Konstruktion festgelegt werden sollte.

Verwandte Themen