Forum: PC-Programmierung C#: aus Konstruktor auf Eigenschaften zugreifen


von Lasse (Gast)


Lesenswert?

Hallo,

ich bin noch Anfänger in C#; nun hat sich bei mir ein Problem ergeben, 
bei dem ich einen Tipp gebrauchen kann.

Ich möchte im Konstruktor der abgeleiteten Klasse über eine Eigenschaft 
eines Feldes, das in der abstrakten Basisklasse deklariert ist, auf das 
Feld der abstrakten Basisklasse zugreifen. Wie kann ich das sinnvoll 
machen?

Das ist die Idee, die ich hatte:

public abstract class BaseClass
{
    private int _a1;

    public int a1
    {
        get;
        set;
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass (int a2)
    {
        //hier soll das Feld a1 über ihre Eigenschaft gesetzt werden.
    }
}

Ich danke schon mal für eure Ratschläge!

Gruß,
Lasse

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Du hast doch in der Basisklasse einen public setter, den sollte man auch 
im Konstruktor aufrufen können, ansonsten mußt du das feld protected 
machen.

von Peter II (Gast)


Lesenswert?

ich habe es jetzt nicht getestet aber es müsste so gehen:

public class DerivedClass : BaseClass
{
    public DerivedClass (int a2)
    {
        a1 = 12;
    }
}

von Markus V. (Gast)


Lesenswert?

Hi Lasse,
1
public abstract class BaseClass
2
{
3
    private int _a1;
4
5
    public int a1
6
    {
7
        get;
8
        set;
9
    }
10
}

dieser Code ist nicht so ganz sinnvoll. Entweder:
1
public abstract class BaseClass
2
{
3
    public int a1
4
    {
5
        get;
6
        set;
7
    }
8
}

oder aber:
1
public abstract class BaseClass
2
{
3
    private int _a1;
4
5
    public int a1
6
    {
7
        get { return _a1; }
8
        set { _a1 = value; }
9
    }
10
}

Ansonsten gilt das von Läubi und Peter II geschriebene.

Gruß
Markus

von Lasse (Gast)


Lesenswert?

Markus V. schrieb:
> oder aber:public abstract class BaseClass
> {
>     private int _a1;
>
>     public int a1
>     {
>         get { return _a1; }
>         set { _a1 = value; }
>     }
> }

Das ist mir auch schon aufgefallen, aber trotzdem danke für den Hinweis.

Läubi .. schrieb:
> Du hast doch in der Basisklasse einen public setter, den sollte man auch
> im Konstruktor aufrufen können

Das geht leider nicht so einfach, weil der Compiler dann nach einem 
Objektverweis verlangt.

von Peter II (Gast)


Lesenswert?

Lasse schrieb:
> Das geht leider nicht so einfach, weil der Compiler dann nach einem
> Objektverweis verlangt.

dann zeig mal den code und den genauen fehler dazu

von Lasse (Gast)


Lesenswert?

Der Code steht oben; die Fehlermeldung lautet wie folgt:

Für das nicht statische Feld, die Methode oder die Eigenschaft ist ein 
Objektverweis erforderlich.

von Peter II (Gast)


Lesenswert?

Lasse schrieb:
> Der Code steht oben; die Fehlermeldung lautet wie folgt:

public DerivedClass (int a2)
    {
        //hier soll das Feld a1 über ihre Eigenschaft gesetzt werden.
    }


zu greifst doch überhaupt nicht auf a1 zu - also kann die Fehlermeldung 
ja nichts damit zu tun haben.

von Lasse (Gast)


Lesenswert?

Oh, irgendwie habe ich da was übersehen. Das Problem ist gelöst, und 
zwar so:

public abstract class BaseClass
{
    private int _a1;

    public int a1
    {
        get { return _a1; }
        set { _a1 = value; }
    }
}

public class DerivedClass : BaseClass
{
    public DerivedClass (int a2)
    {
        a1 = a2;
    }
}

Ich bedanke mich für konstruktive Ratschläge!

von Andreas K. (scavanger)


Lesenswert?

Das ganze funktioniert natürlich auch mit automatisch implementierten 
Eigenschaften (siehe 
http://msdn.microsoft.com/de-de/library/bb384054.aspx), die du im 
Startpost verwendet hast, du darfst dann aber kein privates Feld für die 
Property erstellen, das wird automatisch(!) erstellt, du musst im 
Konstruktor den Namen der Property aufrufen, also so:


public abstract class BaseClass
{
    public int A1 { get; set; }
}

public class DerivedClass : BaseClass
{
    public DerivedClass(int a2)
    {
        A1 = a2;
    }
}


BTW: Propertys werden in C# groß geschrieben.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.