Entwickler-Ecke
C# - Die Sprache - Vererbung und der Zugriff auf die Eigenschaften
LuMa86 - Mo 02.05.16 21:32
Titel: Vererbung und der Zugriff auf die Eigenschaften
Hallöchen,
ich bin schon etwas länger in der Entwicklerecke, war aber noch nie im C#-Bereich unterwegs, denn bisher hatte ich mit C# noch nie viel am Hut. Ich arbeite aktuell an einer Aufgabe für die Schule, habe mich an einem Punkt aber etwas verbissen. Es geht darum eine simple Bücherverwaltung zu entwickeln. Die Klassen mit denen wir arbeiten müssen, sind vorgegeben.
Hier mal die drei Klassen (Kommentare und Konstruktoren entfernt, da die Klassen wirklich extrem simpel sind):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| class Buecher { public string Autor { get; set; } public string Titel { get; set; } public float Preis { get; set; } }
class Buch : Buecher { public int Seiten { get; set; } }
class Ebook : Buecher { public string Format { get; set; } public int Speicherbedarf { get; set; } } |
Wie man sieht existiert eine Basisklasse "Buecher" mit grundlegenden Informationen, und die zwei Klassen "Buch" (für physische Bücher) und "Ebook" (für elektronische Bücher). Die Bücher zeige ich in einer ListBox an. Meine Methode zum Hinzufügen/Bearbeiten sieht so aus:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| private void btnSave_Click(object sender, EventArgs e) { Buecher buch = null; float price;
if (lbBooks.SelectedItem is Buecher) buch = (Buecher)lbBooks.SelectedItem;
float.TryParse(tbPrice.Text, out price);
if (buch != null) { buch.Autor = tbAuthor.Text; buch.Titel = tbTitle.Text; buch.Preis = price;
lbBooks.Items[lbBooks.SelectedIndex] = lbBooks.SelectedItem; } else { buch = new Buecher(tbAuthor.Text, tbTitle.Text, price);
lbBooks.Items.Add(buch); } } |
So weit so gut, das ist bis jetzt ja alles relativ simpel. Nun habe ich aber ein Problem: Ich möchte natürlich auch noch festhalten, ob es sich um ein physisches oder um ein elektronisches Buch handelt. Hier kommen die beiden Klassen "Buch" und "Ebook" ins Spiel. Es gibt auch noch Eingabefelder für Seitenzahl, Speicherformat und Speicherbedarf. Je nachdem welche von denen mit Text gefüllt sind, lassen mich ermittel ob der Benutzer ein normales Buch oder ein E-Book anlegen will. In beiden Fällen muss ich dann anstelle von "Buecher" eine Instanz vom Typ "Buch" oder eben "Ebook" erstellen, da ich ja nicht über die Basisklasse auf die Eigenschaften der beiden erbenden Klassen zugreifen kann. Was sich in der Theorie so simpel anhört, hat bei meinen praktischen Versuchen nicht so recht hingehauen. Ich hatte ein eher undurchschaubares Konstrukt aus if-else-Statements um z.B. herauszufinden von welchem Typ das gerade in der ListBox selektierte Element ist und noch einige andere Problemchen. Was ich da fabriziert habe hat sich irgendwie "nicht richtig" angefühlt.
Mein konkretes Anliegen ist also: Könnte mir jemand einen Anreize geben, wie ich die oben zu sehende Speichern-Methode so erweitern kann, dass ich eine Buch/E-Book Instanz erzeugen und in die Liste aufnehmen kann?
Gruß,
LuMa
Ralf Jansen - Mo 02.05.16 22:04
Ich verstehe noch nicht so ganz was in deiner Methode denn passieren soll. Du sprichst von speichern nimmst aber was einer (vermutlich) Listbox und schreibst es da wieder rein?
Zitat: |
Es gibt auch noch Eingabefelder für Seitenzahl, Speicherformat und Speicherbedarf. Je nachdem welche von denen mit Text gefüllt sind, lassen mich ermittel ob der Benutzer ein normales Buch oder ein E-Book anlegen will |
Und wenn man Seitenzahl und Format füllt? Sollte man nicht erst den Typ auswählen und dann die passenden Felder anzeigen und nicht einfach alles?
LuMa86 - Mo 02.05.16 22:18
Ralf Jansen hat folgendes geschrieben : |
Ich verstehe noch nicht so ganz was in deiner Methode denn passieren soll. Du sprichst von speichern nimmst aber was einer (vermutlich) Listbox und schreibst es da wieder rein?
|
Ups, da hab ich mich wohl verhaspelt. Ich meinte anstelle von "speichern" natürlich "in der ListBox anzeigen".
Ralf Jansen hat folgendes geschrieben : |
Und wenn man Seitenzahl und Format füllt? Sollte man nicht erst den Typ auswählen und dann die passenden Felder anzeigen und nicht einfach alles?
|
Ja klar, das kann ich ja noch imbauen, mit einem Radio-Button oder soetwas in die Richtung. Aber das Prinzip bleibt ja dasselbe: In einem Fall ein E-Book erzeugen, im anderen Fall ein Buch.
Ralf Jansen - Mo 02.05.16 22:27
Dann nehme ich mal an das du an dieser Zeile
buch = new Buecher(tbAuthor.Text, tbTitle.Text, price); hängst?
Es wird dir nicht überbleiben als da eine Bedingung abzufragen und dann entweder denn einen Konstruktor oder denn anderen Konstruktor der jeweils benötigten Klasse aufzurufen. Etwa
C#-Quelltext
1: 2: 3: 4:
| if(meineLiebeBedingung) buch = new Buch(meineLiebenParameter); else buch = new Ebook(meineLiebenParameter); |
Ein andere Ansatz wäre eigene UIs für Buch bzw. EBook zu haben (jeweils ein UserControl) und gezielt dieses anzuzeigen wenn in der Listbox ein EBook oder Buch ausgewählt wurde.
Diese UserControls würden dann gezielt eben Buch oder EBook bearbeiten und es gäbe keine Notwendigkeit einer Bedingung (genauer die Bedingung würde viel früher stattfinden an dem Punkt wo man sich entscheidet ein neues EBook/Buch anzulegen oder man eine der beiden Typen in der Listbox ausgewählt hat).
LuMa86 - Mo 02.05.16 22:49
Genau das ist mein Problem. Es geht eben auch um das Auslesen. Das heißt wenn ich einen Eintrag in der ListBox auswähle, muss ich ja auch erst prüfen ob es jetzt ein Ebook oder ein Buch ist. Ich fand es irgendwie unübersichtlich und dachte es gibt vllt. einen einfacheren Weg.
Dann bedanke ich mich für die Info :)
Delete - Mo 02.05.16 22:58
- Nachträglich durch die Entwickler-Ecke gelöscht -
Ralf Jansen - Mo 02.05.16 23:05
Zitat: |
Das heißt wenn ich einen Eintrag in der ListBox auswähle, muss ich ja auch erst prüfen ob es jetzt ein Ebook oder ein Buch ist |
Zitat: |
C#-Quelltext 1:
| if (lbBooks.SelectedItem is Buecher) | |
Dort prüfst du schon ob das ausgewählte Item ein Buecher ist. Genauso kannst du mit dem is Operator prüfen ob es ein Ebook oder ein Buch ist.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!