Entwickler-Ecke

C# - Die Sprache - Hiding unter Benutzung von Propertys


herbert02 - Do 05.03.09 17:09
Titel: Hiding unter Benutzung von Propertys
Hallo,
Ich suche Hilfe bei einem C# Problem. Googeln hat mir hier leider nicht weitergeholfen.

Ich habe eine Elternklasse mit einem Feld.
In einer Unterklasse möchte ich diese Feld überdecken, allerdings nicht mit einem anderen Feld sondern einer Property.

Sieht so aus:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
    public class Rohr
    {
        public string benennung;
        public double laenge, querschnitt;
    }

    public class RohrRund : Rohr 
    {
        public double durchmesser;

        new public double querschnitt
        {
            get { return (durchmesser * durchmesser * Math.PI / 4.0); }
        }
     }


Dies wird vom Visual Studio so auch ohne Warnungen kompiliert.
Lege ich nun Objekte der Klasse RohrRund an und konvertiere diese mittels (Rohr) zu Objekten der Klasse Rohr ist der Querschnitt des Rohrobjekts immer 0.

Wenn ich direkt die Querschnitteigenschaft des Rohrobjektes anspreche, ist der Wert ungleich 0.
Das Hinzufügen einer set Property hat nichts am Problem geändert.

Weis jemand was hier falsch läuft?
Geht das was ich hier versuche grundsätzlich?

Das Problem ist sicher etwas konstruiert; ich versuche für eine Einführung möglichs viele Sprachelemente unterzubringen.
Trotzdem interessiert es mich doch sehr ob das grundsätzlich geht.

Beste Grüße.

Moderiert von user profile iconKha: C#-Tags hinzugefügt


Kha - Do 05.03.09 17:30

:welcome:

Du sagst es schon selbst: Das Feld wird nur überdeckt, sodass du über RohrRund.querschnitt die neue Property ansprichst. Rohr.querschnitt bezeichnet aber weiterhin das alte Feld.
Du willst den Wert also vielmehr überschreiben; das funktioniert allerdings nur bei Properties, Events und Methoden. Du brauchst also in deiner Basisklasse eine virtuelle/abstrakte Eigenschaft:

C#-Quelltext
1:
public abstract double Querschnitt { get; }                    

In abgeleiteten Klassen kannst du sie dann mit override überschreiben.

PS: Generell sollten unter .NET alle Felder privatesein[*]. Wenn du eine Property ohne besondere Logik brauchst, kannst du die Automatic Properties von C# 3.0 benutzen:

C#-Quelltext
1:
public string Foo { get; set; }                    


[*]Ausgenommen static readonly Felder, aber die sind nicht wirklich häufig ;) .


Th69 - Do 05.03.09 17:38

Dein Beispiel erscheint mir wirklich sehr konstruiert und die Gleichbenennung von Feldern und Eigenschaften sollte man generell vermeiden (laut .NET Namenskonvention sollten Felder kleingeschrieben und Eigenschaften mit einem großen Anfangsbuchstaben geschrieben werden, bei dir also "Querschnitt").

Der Fehler bei dir liegt daran, daß du in deiner Eigenschaft "querschnitt" nicht die Feldvariable "querschnitt" beschreibst und daher bleibt dieser Wert bei 0 (Standardinitialisierung).

Alles andere hat Kha ja schon geschrieben...


herbert02 - Do 05.03.09 17:53

Vielen Dank für die schellen und hilfreichen Antworten und auch die nützlichen Zusatztips.

Mit abstract und override funktionierts prima.

Jetzt sind allerdings so viele nicht ganz triviale Sprachelemete enthalten, dass ich das Thema für die Spracheinführung wohl etwas nach hinten schieben werde...