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
Kha: 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...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!