AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Übung Polymorphie

Ein Thema von EdAdvokat · begonnen am 19. Nov 2017 · letzter Beitrag vom 20. Nov 2017
Antwort Antwort
Seite 1 von 2  1 2      
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Übung Polymorphie

  Alt 19. Nov 2017, 16:14
Hallo, ich wage mich mal wieder ins Forum mit der Bitte, über meine kleine Übung zur Polymorphie zu sehen und mir ggf. einen Tip zu geben ob und wo ich was nicht richtig gemacht habe.
Auf einige Kleinigkeiten, wie der Prüfung ob die Werte größer 0 bzw. nur Zahlen sein dürfen habe ich hier verzichtet.
Meine Frage ist: habe ich das Prinzip der Polymorphie in Form der Klassen (TFigur, TRechteck, TDreieck) so richtig verstanden?
Vielen Dank im voraus.
Programm anbei

Delphi-Quellcode:
unit uBerechnung;

interface

uses Vcl.Dialogs;

type TFigur = class(TObject)
  private
    FSeiteA:Double;
    FSeiteB:Double;
    procedure SetSeiteA(A:Double);virtual;abstract;
    procedure SetSeiteB(B:Double);virtual;abstract;

    function getSeiteA:Double;virtual;abstract;
    function getSeiteB:Double;virtual;abstract;
    function getBerechneFl:Double;virtual;abstract;
end;

type TRechteck = class(TFigur)
  private
    procedure SetSeiteA(A:Double);override;
    procedure SetSeiteB(B:Double);override;
    function getSeiteA:Double;override;
    function getSeiteB:Double;override;
    function getBerechneFl:Double; override;
   public
    property SeiteA:Double read FSeiteA write FSeiteA;
    property SeiteB:Double read FSeiteB write FSeiteB;
    property BerechneFl:Double read getBerechneFl;
end;

type TDreieck = class(TRechteck)
  private
    procedure SetSeiteA(A:Double);override;
    procedure SetSeiteB(B:Double);override;
    function getSeiteA:Double;override;
    function getSeiteB:Double;override;
    function getBerechneFl:Double;override;
   public
    property SeiteA:Double read FSeiteA write FSeiteA;
    property SeiteB:Double read FSeiteB write FSeiteB;
    property BerechneFl:Double read getBerechneFl;
end;

implementation

{ TRechteck }


function TRechteck.getBerechneFl: Double;
begin
  result:=FSeiteA*FSeiteB;
end;

function TRechteck.getSeiteA: Double;
begin
  result:=FSeiteA;
end;

function TRechteck.getSeiteB: Double;
begin
  result:=FSeiteB;
end;

procedure TRechteck.SetSeiteA(A: Double);
begin
  FSeiteA:=A;
end;

procedure TRechteck.SetSeiteB(B: Double);
begin
  FSeiteB:=B;
end;


{ TDreieck }

function TDreieck.getBerechneFl: Double;
begin
  result:=FSeiteA*FSeiteB/2;
end;

function TDreieck.getSeiteA: Double;
begin
  result:=FSeiteA;
end;

function TDreieck.getSeiteB: Double;
begin
  result:=FSeiteB;
end;

procedure TDreieck.SetSeiteA(A: Double);
begin
  FSeiteA:=A;
end;

procedure TDreieck.SetSeiteB(B: Double);
begin
  FSeiteB:=B;
end;

end.
und die Form:
Delphi-Quellcode:
unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uBerechnung, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    btnEnde: TButton;
    edtSeiteA: TEdit;
    edtSeiteB: TEdit;
    lblSeiteA: TLabel;
    lblSeiteB: TLabel;
    lblErg: TLabel;
    btnFl: TButton;
    btnDreieck: TButton;
    procedure btnEndeClick(Sender: TObject);
    procedure btnFlClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnDreieckClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btnDreieckClick(Sender: TObject);
var MyFigure: TDreieck;
begin
  MyFigure := TDreieck.Create;
  try
    MyFigure.SeiteA:=strtofloat(edtSeiteA.text);
    MyFigure.SeiteB:=strtofloat(edtSeiteB.text);
    lblErg.caption:=floattostr(MyFigure.BerechneFl)
  finally
    MyFigure.Free;
  end;
end;

procedure TForm1.btnEndeClick(Sender: TObject);
begin
  close;
end;

procedure TForm1.btnFlClick(Sender: TObject);
var MyFigure : TRechteck;
begin
  MyFigure := TRechteck.Create;
  try
    MyFigure.SeiteA:=strtofloat(edtSeiteA.text);
    MyFigure.SeiteB:=strtofloat(edtSeiteB.text);
    lblErg.caption:=floattostr(MyFigure.BerechneFl);
  finally
    MyFigure.Free;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  edtSeiteA.text:='';
  edtSeiteB.text:='';
end;

end.
Angehängte Dateien
Dateityp: zip figur.zip (53,3 KB, 1x aufgerufen)
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#2

AW: Übung Polymorphie

  Alt 19. Nov 2017, 17:07
Deklariere Deine lokalen Variablen in den Form-Methoden einmal als TFigur. Wenn der Code dann funktioniert, ist das Polymorphie (etwas vereinfacht, aber im Kern richtig).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Übung Polymorphie

  Alt 19. Nov 2017, 17:39
nachdem ich in der class TFigur eine Ergänzung vorgenommen habe und dann in der Form die lokale Var in TFigur umbenannt habe geht es auch.
Zuvor hatte das Programm jedoch auch keine Probleme.
Delphi-Quellcode:
type TFigur = class(TObject)
  private
    FSeiteA:Double;
    FSeiteB:Double;
    procedure SetSeiteA(A:Double);virtual;abstract;
    procedure SetSeiteB(B:Double);virtual;abstract;

    function getSeiteA:Double;virtual;abstract;
    function getSeiteB:Double;virtual;abstract;
    function getBerechneFl:Double;virtual;abstract;
  public
    property SeiteA:Double read FSeiteA write FSeiteA;
    property SeiteB:Double read FSeiteB write FSeiteB;
    property BerechneFl:Double read getBerechneFl;
Danke.
Also habe ich das Problem wohl richtig verstanden?!
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.656 Beiträge
 
Delphi 12 Athens
 
#4

AW: Übung Polymorphie

  Alt 19. Nov 2017, 18:12
Ich würde die virtuellen Methoden als protected deklarieren, sonst gibt es Kummer, wenn Du die Ableitungen einmal in eine eigene Unit verschiebst. Und Polymorphie bedeutet ja Vielgestaltigkeit, d.h. der konsumierende Code muss die konkrete Klasse, die er benutzt, gar nicht kennen. Es genügt, wenn er die Basisklasse kennt, ihn interessiert es dabei dann nicht mehr, um welche Ableitung es sich handelt.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Übung Polymorphie

  Alt 19. Nov 2017, 18:25
habe den Hinweis berücksichtigt, jedoch erhalte ich den folgenden Hinweis:
Zitat:
[dcc32 Hinweis] uBerechnung.pas(25): H2269 Durch das Überschreiben erhält die virtuelle Methode 'TRechteck.SetSeiteA' eine geringere Sichtbarkeit (private) als die Basisklasse 'TFigur' (protected)
Damit kann man sicher leben.
Norbert
  Mit Zitat antworten Zitat
Aviator

Registriert seit: 3. Jun 2010
1.611 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Übung Polymorphie

  Alt 19. Nov 2017, 18:44
Schreibe den Setter ebenfalls in den Protected Abschnitt und dann ist auch die Warnung weg. Warnungen solltest du schon beachten und auch entsprechend versuchen sie zu beheben. Nicht einfach damit leben.
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Übung Polymorphie

  Alt 20. Nov 2017, 10:08
Von mir:
- in unit uBerechnung kein uses Vcl.Dialogs
- statt "privat" besser "strict privat" und "strict" auch bei "protected"
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Übung Polymorphie

  Alt 20. Nov 2017, 12:21
Danke Hoika, ja so funktioniert es.

Danke auch an Freimatz, vcl.dialogs habe ich aufgenommen, da ich eigentlich mit showmessage arbeiten wollte. Hat sich aber erledigt. Warum soll ich ausdrücklich "strict" private bzw. strict protected verwenden? reicht private bzw. protected nicht aus? was ist da anders bzw. besser?

Danke DaddyH, das ist wesentlich einfacher und übersichtlicher. Warum bin ich nicht darauf gekommen? Ich habe mich von dem Gedöns Getter und Setter verleiten lassen.
Aber so einfach funktioniert es auch einwandfrei und vermeidet Stolpersteine.
Wieder ein kleines Problemchen gelöst.
Norbert
  Mit Zitat antworten Zitat
SProske

Registriert seit: 16. Feb 2015
Ort: Halle/S.
116 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Übung Polymorphie

  Alt 20. Nov 2017, 12:29
Warum soll ich ausdrücklich "strict" private bzw. strict protected verwenden? reicht private bzw. protected nicht aus? was ist da anders bzw. besser?
Ohne das strict haben auch andere Klassen innerhalb der selben Unit Zugriff, also TRechteck auf private Member von TDreieck und umgekehrt.
Sebastian
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.490 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Übung Polymorphie

  Alt 20. Nov 2017, 12:38
Genau das ist es. Das ist bei deinem Problem nur eine Kleinigkeit sollte man sich jedoch angewöhnen. Siehe auch: https://de.wikipedia.org/wiki/Datenk...rogrammierung)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 21:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz