Autor Beitrag
LuMa86
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Mo 02.05.16 21:32 
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):

ausblenden 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:

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


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: Mo 02.05.16 22:18 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

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".

user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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

ausblenden 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).

Für diesen Beitrag haben gedankt: LuMa86
LuMa86 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 76



BeitragVerfasst: 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 :)
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 02.05.16 22:58 
- Nachträglich durch die Entwickler-Ecke gelöscht -
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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:
ausblenden 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.