AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Klassen in versch Units vererben

Ein Thema von IFlyA380 · begonnen am 29. Nov 2016 · letzter Beitrag vom 30. Nov 2016
Antwort Antwort
Seite 1 von 2  1 2   
IFlyA380

Registriert seit: 29. Nov 2016
3 Beiträge
 
#1

Klassen in versch Units vererben

  Alt 29. Nov 2016, 19:01
Delphi-Version: 5
Hallo zusammen,

ich habe ein kleiner Problem: Ich soll in der 1. Unit eine Klasse erstellen. Dann soll ich eine neue Unit erstellen (Unit2) und die weitere Klasse soll nun aus der der Unit1 erben.

Code:
unit u_Bank;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  u_Konto;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
    end;
 type
  { TBank }
    TBank = class(TObject)
      public
    Name: String;
    Standort: String;
    Geld: real;
   // procedure einzahlen(Betrag:real);
   //procedure auszahlen(Betarg:real);
   //procedure ueberweisen;
   //function gibtKontostand:String;
   constructor create(FName, FStandort: String);
   destructor destroy;

  end;

   // type
 { TKonto = class(TBank)
    public
       Kontostand: real;
       Besitzer: String;

  end;              }

var
  Form1: TForm1;
  HBank : TBank;
  Konto1: TKonto;
implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
begin
   HBank := TBank.Create('Hansa Bank HH', 'Hamburg');
   Label2.Caption:= HBank.Name;
   Konto1 := TKonto.Create(1234, 1000, 'Niklas', 'Osbahr');
end;

constructor TBank.Create(FName, FStandort: String);
begin
   inherited create;
   Name := FName;
   Standort := FStandort;
end;

destructor TBank.destroy;
begin
   inherited destroy;
end;

end.
Code:
unit u_Konto;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

type
  TKonto = class(TBank)
    public
       Kontostand: real;
       Besitzer: String;
       Kontonummer: integer;
       Constructor create(FKontonummer:integer; FKontostand:real; FBesitzer :string);
  end;
var
  Konto1: TKonto;

implementation

Constructor create(FKontonummer:integer; FKontostand:real; FBesitzer :string);
begin
  inherited create;
  Kontonummer := FKontonummer;
  Kontostand := FKontostand;
  Besitzer := FBesitzer;
end;

end.
Soweit so gut.
Lazarus gibt dann den Fehler raus, dass TBank an der Stelle TKonto = class(TBank) nicht bekannt sei.
Was mache ich falsch?

LG
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.874 Beiträge
 
Delphi 12 Athens
 
#2

AW: Klassen in versch Units vererben

  Alt 29. Nov 2016, 19:04
Nimm u_bank in die uses von u_konto auf. Das sollte es dann gewesen sein.
Thomas Breitkreuz
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#3

AW: Klassen in versch Units vererben

  Alt 30. Nov 2016, 10:17
Zusätzlich muss das uses u_Konto aus der unit u_Bank aber entfernt werden, sonst bekommst du wohl eine zirkuläre Referenz.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Klassen in versch Units vererben

  Alt 30. Nov 2016, 10:44
Eigentlich müsste TForm1 in eine eigene Unit ausgelagert werden.
Delphi-Quellcode:
unit u_Bank;

type
  TBank = class(TObject)
  public
    Name: String;
    Standort: String;
    Geld: real;
    constructor create(FName, FStandort: String);
    destructor destroy;
  end;
Die Variablen HBank und Konto1 gehören eindeutig zu TForm1 und sollten deshalb dort deklariert werden.
Delphi-Quellcode:
unit u_Form1;

uses
  uBank, uKonto;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
    HBank : TBank;
    Konto1: TKonto;
  public
    { public declarations }
  end;
Die Klasse TKonto von TBank abzuleiten ist fachlich falsch. Das Konto gehört zu einer Bank, eine Bank verwaltet mehrere Konten.
Das könnte man z.B. so abbilden:
Delphi-Quellcode:
TBank = class;

TKonto = class(TObject)
private
  FBank: TBank; {im Konstruktor als Parameter übergeben und in die Liste der Bank eintragen}
public
  property Bank: TBank read FBank;
end;

TKontoList = class(TObjectList)
end;

TBank = class(TObject)
private
  FKonten: TKontoList; {im Konstruktor erzeugen, im Destruktor freigeben}
public
  property Konten: TKontoList read FKonten;
end;
  Mit Zitat antworten Zitat
IFlyA380

Registriert seit: 29. Nov 2016
3 Beiträge
 
#5

AW: Klassen in versch Units vererben

  Alt 30. Nov 2016, 16:49
Danke für die Antworten.

Das mit dem Tauschen der uses funktioniert leider nicht. Jetzt erkennt TForm1 TBank nicht.

Die Idee des Vererbens war, dass u_Konto auf die Methoden von u_Bank zugreifen kann.
Somit eine Erweiterung der Bank ist.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Klassen in versch Units vererben

  Alt 30. Nov 2016, 16:56
Dein Ansatz ist schon falsch.
Man würde Konto nie von Bank ableiten. Eine Ableitung ist quasi eine Spezialisierung.
Delphi-Quellcode:
TFahrzeug = class
TAuto = class(TFahrzeug)
TLKW = class(TFahrzeug)
TMotorrad = class(TFahrzeug)
Autos, LKWs und Motorräder sind spezielle Arten von Fahrzeugen.
Sie unterscheiden sich zwar, aber es sind im Grunde alles Fahrzeuge (daher die Ableitung von TFahrzeug).

Bei Bank und Konto funktioniert das nicht. Ein Konto ist etwas anderes als eine Bank.
Ein Konto ist keine spezielle Art von Bank sondern etwas anderes (wenn auch TEIL einer Bank).

Was du tun würdest wäre eine Klasse TBank und eine Klasse TKonto (NICHT von TBank ableiten).
TBank fügst du eine Liste von TKonto hinzu und Methoden zum Verwalten dieser Liste - z.B. "procedure KontoHinzufuegen(AKontoNr: Integer; ABesitzer: TPerson)"

Delphi-Quellcode:
TKonto = class
private
  FKontoNr: Integer;
  FKontostand: Currency;
  FBesitzer: String;
public
  property Besitzer: String read FBesitzer write FBesitzer;
  property KontoNr: Integer read FKontoNr write FKontoNr;
  property Kontostand: Currency read FKontostand write FKontostand;
end;

TBank = class
private
  FKonten: TObjectList<TKonto>; // Im constructor erstellen.
public
  property Konten[Index: Integer]: TKonto read GetKonto; // Result := FKonten[Index];
  property KontoCount: Integer read GetKontoCount; // Result := FKonten.Count;
  procedure AddKonto(AKontoNr: Integer; ABesitzer: String); // Konto-Objekt erstellen, Eigenschaften zuweisen und der Liste hinzufügen.
end;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (30. Nov 2016 um 17:01 Uhr)
  Mit Zitat antworten Zitat
TiGü
Online

Registriert seit: 6. Apr 2011
Ort: Berlin
3.058 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Klassen in versch Units vererben

  Alt 30. Nov 2016, 16:57
Das mit dem Tauschen der uses funktioniert leider nicht. Jetzt erkennt TForm1 TBank nicht.
Steht die Unit uBank.pas in den uses von u_Form1.pas wie von Blup gezeigt?

Die Idee des Vererbens war, dass u_Konto auf die Methoden von u_Bank zugreifen kann.
Somit eine Erweiterung der Bank ist.
Falscher Ansatz! Mach alles weitere über eine dritte Klasse (TÜberweisungsManager, TÜbertragManager, usw.)
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Klassen in versch Units vererben

  Alt 30. Nov 2016, 16:57
Trenne TForm1 und TBank (TBank in eine eigene Unit) und binde diese Unit in u_konto ein. Dann u_konto in die Unit von TForm1

Ansonsten bleibt zu sagen, dass, zumindest logisch gesehen, TKonto nicht von TBank abgeleitet sein sollte.

......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: Klassen in versch Units vererben

  Alt 30. Nov 2016, 17:44
Eigentlich müsste man den Kunden noch dazwischen packen. Eine Bank hat Kunden und diese Kunden haben Konten. Dabei würde ich aber gar nichts ableiten, denn welche Methoden oder Attributen soll denn eien Konto mit einer Bank gemeinsam haben? Eher ist es so, dass die Bank als Container für die Kunden dient (Objektliste) und die Kunden wiederum als Container (Objektlist) für die Konten dienen.

Wenn es allerdings eine Übung sein soll, ist sie etwas sehr konstruiert und doof .
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
IFlyA380

Registriert seit: 29. Nov 2016
3 Beiträge
 
#10

AW: Klassen in versch Units vererben

  Alt 30. Nov 2016, 20:59
Demnach könnte ich aber ein Sparkonto von der Klasse TKonto ableiten oder?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz