Autor Beitrag
herbert02
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 05.03.09 17:09 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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:
ausblenden 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:
ausblenden C#-Quelltext
1:
public string Foo { get; set; }					


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

_________________
>λ=
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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...