Autor Beitrag
karstenK
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Do 19.01.12 14:20 
Hallo liebe Community,
ich bin eine Neuling im Bereich C#. Ich erarbeite mir gerade einige Grundlagen um ein bisschen mehr Verständnis in C# zu bekommen.

Ich habe vollgendes Problem. Es gibt in meine Projekt zwei abstrakte Klassen, Ticket und Ticketautomat. Der Ticketautomat kennt immer die Sorte Tickets, die er verkauft, deshalb ist das erste öffentliche Attribut/Eigenschaft von Ticketautomat --> public Ticket Ticketart{get;protected set;}.

Nun habe ich mir eine Klasse Bahnticket geschrieben, welche von Ticket erbt. Außerdem habe ich noch einen Bahnticketautomat der von Ticketautomat erbt.

Jetzt will ich im Konstruktor von Bahnticketautomat sagen: Ticketart = new Bahnticket();

Wenn ich nun auf Ticketart zugreifen will sehe ich nicht die extra Eigenschaften von Bahnticket, wie Startbahnhof oder Endbahnhof, Leider siehe ich nur alle Attribute von Ticket.

Wie kann ich das Lösen, damit ich einem Automaten belibige Tickets zuweisen kann?


Hier nochmal der Code:
Ticket:

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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VielseitigerTicketautomat
{
  public abstract class Ticket
  {
    public abstract void drucken();

    public double Preis
    {
      get;
      protected set;
    }

    public string getFormatiertenPreis()
    {
      return String.Format( "{0:0.00}", Preis )+ " €";  
    }
    

  }
}



Ticketautomat:

ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VielseitigerTicketautomat
{
  public abstract class Ticketautomat
  {
    
    public double EingeworfenesGeld{get;protected set;}
    public Ticket Ticketart{get;protected set;}

    public void geldEinwerfen(double wert)
    {
      
      if(wert > 0)
      {
        EingeworfenesGeld += wert;
        Console.WriteLine("Wollen Sie den Vorgang abbrechen? (ja/nein)");
        string antwort = Console.ReadLine();
        if(antwort == "ja")
        {
          Console.WriteLine("Geldausgabe: Sie bekommen zurück: " + EingeworfenesGeld + " €");
          return;
        }
        else
        {
          if (genugGeldEingeworfen())
          {
            if (EingeworfenesGeld - Ticketart.Preis != 0.0)
            {
              gibWechselGeld();
            }
          }
          else
          {
            geldEinwerfen( Convert.ToDouble( Console.ReadLine() ) );
          }
          
        }

      }
    }

    public void Ticketdrucken()
    {
      
      if (EingeworfenesGeld == Ticketart.Preis)
      {
        Ticketart.drucken();
      }
      else
      {
        Console.WriteLine( "Der Preis stimmt noch nicht! Ticket wird nicht gedruckt!" );
      }

    }

    public bool genugGeldEingeworfen()
    {
      if (EingeworfenesGeld == Ticketart.Preis)
      {
        return true;
      }
      else if (EingeworfenesGeld < Ticketart.Preis)
      {
        return false;
      }
      else if (EingeworfenesGeld > Ticketart.Preis)
      {
        return true;
      }
      else
      {
        return false;
      }
    }

    public double gibWechselGeld()
    {
      return EingeworfenesGeld - Ticketart.Preis;
    }
    
  }
}



Bahnticket:

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:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VielseitigerTicketautomat 
{
  public class Bahnticket: Ticket
  {
    public string Startbahnhof{get;set;}
    public string Endbahnhof{get;set;}

    public override void  drucken()
    {
      Console.WriteLine("***Bahnticket***");
      Console.WriteLine( "Startbahnhof: " + Startbahnhof);
      Console.WriteLine( "Zielbahnhof: " + Endbahnhof );
      Console.WriteLine("Preis: " + Preis);
      Console.WriteLine( "****************" );
   
    }

  }
}



Bahnticketautomat:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace VielseitigerTicketautomat 
{
  public class Bahnticketautomat : Ticketautomat
  {
    public Bahnticketautomat()
    {
      Ticketart = new Bahnticket();
    }

    public void waehleStartBahnhof(string startbahnhof)
    {
      Ticketart.??? //hier kann ich nicht auf Startbahnhof zugreifen
    }

  }
}



Mit freundlichen Grüßen
Karsten
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 19.01.12 15:19 
Wenn der Automat immer genau 1 Typ von Tickets verkauft wäre eine Möglichkeit die Ticketautomat Klasse generisch mit dem genauen Ticket als generischen Parameter zu implementieren.

Wie das ungefähr funktioniert kannst du aus der Msdn entnehmen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
public abstract class Ticketautomat<T> where T : Ticket<T>, new()
{
    public T Ticketart{get;protected set;}
    ....
}

public class Bahnticketautomat : Ticketautomat<Bahnticket>
{
    public void waehleStartBahnhof(string startbahnhof)
    {
       // Ticketart ist generischer Parameter T hier ein Bahnticket daher kannst du jetzt direkt auf die ganze Oberfläche von Bahnticket ohn ezu casten zugreifen
       Ticketart.??? 
    }
    .....
}

Für diesen Beitrag haben gedankt: karstenK