Einzelnen Beitrag anzeigen

marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Probleme mit selbst erstellter Klasse

  Alt 5. Jun 2005, 21:13
Der fundamentale Fehler schlechthin ist die Sache mit den globalen Variablen Nach und Anzahl. Anzahl gehört eigentlich zum Gedächtnis deines Kunden-Objektes. Mit dem Verweis auf den Nachfolger ist das allerdings so eine Sache. Der Grad der Entkopplung deiner Klassen bestimmt wo dieser Verweis unterzubringen ist.

Denkbar sind folgende Ansätze:

(1) Deine Queue ist spezifisch und kann nur Objekte einer bestimmten Klasse verwalten.
(2) Deine Queue ist generisch und kann Objekte einer beliebigen Klasse verwalten.
(2.1) Die Klasse TKunde ist Nachfahre einer speziellen Klasse TQueueItem.
(2.2) Die Klasse TQueueItem enthält einen Verweis auf ein Kunden-Objekt.

Ich favorisiere Ansatz (2) und bei deiner Aufgabe dürften die beiden dort unterschiedenen Varianten beide problemlos umsetzbar sein.

Delphi-Quellcode:
// Variante (2.1)

type
  TQueueItem = class
  private
    FNext: TQueueItem;
  public
    property Next: TQueueItem read FNext write FNext;
  end;
  
  TKunde = class(TQueueItem)
  private
    FAnzahl: integer;
  public
    constructor Create(anzahl: integer);
    procedure Auflegen; // Einen Artikel zum Erfassen geben
    property Anzahl: integer read FAnzahl; // write nur intern
    property Naechster: TKunde read FNext;
  end;
Delphi-Quellcode:
// Variante (2.2)

type
  TQueueItem = class
  private
    FNext: TQueueItem;
    FData: TObject;
  public
    consturctor Create(data: TObject);
    property Data: TObject read FData;
    property Next: TQueueItem read FNext write FNext;
  end;
  
  TKunde = class
  private
    FAnzahl: integer;
  public
    constructor Create(anzahl: integer);
    procedure Auflegen; // Einen Artikel zum Erfassen geben
    property Anzahl: integer read FAnzahl; // write nur intern
  end;
Früher oder später solltest du dir angewöhnen abstrakte Klassen (Queue) und solche aus deinem Aufgabenfeld (Kunde, Kasse) voneinander zu trennen. Hier noch ein Code-Schnippsel für TQueue:

Delphi-Quellcode:
  TQueue = class
  private
    FHead: TQueueItem;
    FTail: TQueueItem;
  public
    function Add(qi: TQueueItem): TQueueItem;
    function Remove: TQueueItem;
    property Head: TQueueItem read FHead;
  end;
Ein anderer Fehler ist deine Verwendung von Randomize(). Diese Prozedur dient eigentlich dazu dem Pseudo-Zufallszahlen-Generator einen bestimmten Seed-Wert zu verpassen, damit er eine reproduzierbare Folge von Zufallszahlen erzeugt. Brauchst du eigentlich nicht wirklich - schon gar nicht im Konstruktor deiner Kunden-Klasse.

Bevor ich deine Hausaufgaben jetzt ganz erledige warte ich lieber mal darauf, was du so zu Stande bringst.

marabu
  Mit Zitat antworten Zitat