AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Interface richtig verstanden?
Thema durchsuchen
Ansicht
Themen-Optionen

Interface richtig verstanden?

Ein Thema von EdAdvokat · begonnen am 3. Mai 2019 · letzter Beitrag vom 9. Mai 2019
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

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 10:14
Danke für eure Hinweise. Ich habe es also etwas verändert und es läuft gut. Nun möchte ich noch etwas tiefer in die Problematik Interface einsteigen.
Delphi-Quellcode:
unit logic;

interface

uses Vcl.Dialogs;

Type
IFigur = interface
 ['{921A6F17-0D63-40EC-82FD-F60CB5F66DC3}']
   function Umfang:double;
   Function Flaecheninhalt:double;
end;

type
  TFigure = class abstract(TInterfacedObject, IFigur)//Basis_Class
  private
   FSeiteA : Double;
   FSeiteB : Double;
  strict protected
   function Umfang: Double;virtual;
   function Flaecheninhalt: Double;virtual;
  public
    property SeiteA: Double read FSeiteA write FSeiteA;
    property SeiteB: Double read FSeiteA write FSeiteB;
 end;

type
 TQuadrat = class (TFigure, IFigur) //class Decleration mit Hinweis auf IFigur
  strict protected //TInterfacedObject übernimmt die Freigabe d. Objects
    function Umfang:double;override;
    function Flaecheninhalt:Double;override;
  public
    property Umfangber: Double read Umfang;
    property Flaechenber: Double read Flaecheninhalt;
 end;

type
 TDreieck = class(TFigure, IFigur)
  private
   FSeiteC : double;
   FHoehe : Double;
  strict protected
   function Umfang:double;override;
   function Flaecheninhalt:double;override;
  public
   property SeiteC: Double read FSeiteC write FSeiteC;
   property Hoehe: Double read FHoehe write FHoehe;
   property Umfangber: Double read Umfang;
   property Flaechenber: Double read Flaecheninhalt;
 end;

type
 TTrapez = class(TFigure, IFigur)
  private
   FSeiteC : Double;
   FSeiteD : Double;
   FHoehe : double;
  strict protected
   function Umfang:double;override;
   function Flaecheninhalt:double;override;
  public
    property SeiteC: Double read FSeiteC write FSeiteC;
    property SeiteD: Double read FSeiteD write FSeiteD;
    property Hoehe: Double read FHoehe write FHoehe;
    property Umfangber: Double read Umfang;
    property Flaechenber: Double read Flaecheninhalt;
 end;

implementation

  { TQuadrat }

function TQuadrat.Flaecheninhalt: double;
begin
  Result:=FseiteA*FSeiteB;
end;

function TQuadrat.Umfang: double;
begin
  Result:=2*FseiteA+2*FseiteB;
end;

{ TDreieck }

function TDreieck.Flaecheninhalt: double;
begin
 Result:=FSeiteA*FSeiteB/2;
end;

function TDreieck.Umfang: double;
begin
   Result:=FSeiteA+FSeiteB+FSeiteC;
end;

 { TTrapez }

function TTrapez.Flaecheninhalt: Double;
begin
  result:=(FSeiteA+FSeiteC)/2*FHoehe;
end;

function TTrapez.Umfang: Double;
begin
  Result:=FSeiteA+FSeiteB+FSeiteC+FSeiteD;
end;

{ TFigure }

function TFigure.Flaecheninhalt: Double;
begin
  Result:=Flaecheninhalt;
end;

function TFigure.Umfang: Double;
begin
  Result:=Umfang;
end;

end.
und das MainForm:
Delphi-Quellcode:
unit uMain;

interface

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

type
  TForm1 = class(TForm)
    lbl1: TLabel;
    btn1: TButton;
    edt1: TEdit;
    btn2: TButton;
    edt2: TEdit;
    lbl2: TLabel;
    lbl3: TLabel;
    btn3: TButton;
    edt3: TEdit;
    lbl4: TLabel;
    lbl5: TLabel;
    lbl6: TLabel;
    lbl7: TLabel;
    btn4: TButton;
    lbl9: TLabel;
    edt4: TEdit;
    edt5: TEdit;
    lbl10: TLabel;
    lbl11: TLabel;
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btn2Click(Sender: TObject);
    procedure btn3Click(Sender: TObject);
    procedure btn4Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.btn2Click(Sender: TObject);
var MyFigure: TQuadrat;
begin
  MyFigure:=TQuadrat.Create; //Freigabe nicht erf., da TInterfacedObject dies übernimmt
  try
  MyFigure.SeiteA:=strtoint(edt1.Text);
  MyFigure.SeiteB:=StrToInt(edt2.text);
  lbl2.Caption:=FloatToStr(MyFigure.Umfangber);
  lbl3.Caption:=FloatToStr(MyFigure.Flaechenber);
  except
    on E:Exception do
    begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
    end;
  end;
end;

procedure TForm1.btn3Click(Sender: TObject);
var MyFigure: TDreieck;
begin
  MyFigure:=TDreieck.Create;
  try
  MyFigure.SeiteA:=StrToFloat(edt1.Text);
  MyFigure.SeiteB:=StrToFloat(edt2.text);
  MyFigure.SeiteC:=StrToFloat(edt4.text);
  lbl2.Caption:=FloatToStr(MyFigure.Umfangber);
  lbl3.Caption:=FloatToStr(MyFigure.Flaechenber);
  except
    on E:Exception do
    begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
    end;
  end;
end;

procedure TForm1.btn4Click(Sender: TObject);
var MyFigure: TTrapez;
begin
  MyFigure:=TTrapez.Create;
  try
  MyFigure.SeiteA:=StrToFloat(edt1.Text);
  MyFigure.SeiteB:=StrToFloat(edt2.text);
  MyFigure.Hoehe:=StrToFloat(edt3.text);
  MyFigure.SeiteC:=StrtoFloat(edt4.Text);
  MyFigure.SeiteD:=StrtoFloat(edt5.Text);
  lbl2.Caption:=FloatToStr(MyFigure.Umfangber);
  lbl3.Caption:=FloatToStr(MyFigure.Flaechenber);
  except
    on E:Exception do
    begin
       ShowMessage('Exception class name = '+E.ClassName);
       ShowMessage('Exception message = '+E.Message);
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  edt1.Clear;
  edt2.Clear;
  edt3.Clear;
  edt4.Clear;
  edt5.Clear;
  lbl2.Caption:='';
  lbl3.Caption:='';
end;

end.
Norbert
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 15:10
Nun möchte ich noch etwas tiefer in die Problematik Interface einsteigen.
Interfaces sind keine Problematik, sie sind eine Lösung.
Rudy Velthuis
  Mit Zitat antworten Zitat
EdAdvokat

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

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 16:15
Hallo zusammen,
nun habe ich mit meiner Drohung ernst gemacht und biete eine neue "Lösung" der Problematik (!) Interface an.
Um nicht auch eines Plagiats verdächtig zu sein verweise ich auf eine 3-teilige Videoaufzeichnung von StahliSoft in seinem Youtubekanal zu diesem Thema.
Ich habe diese Videos aufmerksam verfolgt und mit dem beiliegenden Projekt nachempfunden. Ich danke dem Euch sicher aus dem hiesigen Formum und seinen
anderen Veröffentlichungen bekannten A. Stahl ganz herzlich für das sehr unaufgeregt und verständlich dargestellte Video zu einem doch nicht ganz einfachen Thema.
Ich hoffe, dass ich alles richtig gemacht habe. Jedenfalls läuft es bei mir ohne erkenntliche Fehler.
Angehängte Dateien
Dateityp: zip Interface_new1.zip (54,7 KB, 6x aufgerufen)
Norbert

Geändert von EdAdvokat ( 4. Mai 2019 um 16:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 18:48
Oh, zu viel der Ehre. Aber Danke.

In Deinem Projekt sind mir beim schnellen drauf schauen ein paar Dinge aufgefallen:

- OnCreate wird nicht aufgerufen. Die Ereignisbehandlung ist nicht richtig zugewiesen. (Musst Du mal zuweisen und einen Haltepunkt setzen.)
- Die Methoden Fahr und Flieg und Schwimm rufen sich selbst auf. Das führt zu einem Stack Overflow.
- Deine Klassen leitest Du manchmal von TInterfacedObject ab und manchmal von einer eigenen Basisklasse. Das ist nicht falsch, aber man muss sich immer genau überlegen, von was man ableitet, damit das dann zur Geschäftslogik passt.
- Supports kann noch mehr. Man kann eine eigene Variable dafür benutzen. Ich mache gern das so weil es m.E. übersichtlicher ist:
Delphi-Quellcode:
var
  lSchwimm: ISchwimm;

  if Supports(I, ISchwimm, lSchwimm) then
    lSchwimm.Schwimm;

Ich hoffe, das hilft noch etwas weiter...
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 19:11
Delphi-Quellcode:
var
  lSchwimm: ISchwimm;
Echt jetzt, lSchwimm und ISchwimm? Die sind ja kaum auseinander zu halten!

Dann schreibe doch wenigstens LSchwimm. Das ist besser lesbar.
Rudy Velthuis
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.352 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 19:17
"l" für lokal
Ich komme damit klar.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 19:29
"l" für lokal
Ich komme damit klar.
Mag sein, ist aber weder besonders zweckmäßig, noch konform mit den allgemeinen Style-Guidelines.
Dennis
  Mit Zitat antworten Zitat
Rudy Velthuis

Registriert seit: 10. Sep 2011
Ort: Gelsenkirchen
42 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Interface richtig verstanden?

  Alt 4. Mai 2019, 19:57
"l" für lokal
Ich komme damit klar.
"L" wäre auch für lokal und lesbar.

Und man schreibt nicht nur für sich selbst. Code sollte lesbar sein, damit auch andere ihn lesen können (oder du selbst, z.B. nach 6 Monaten).
Vor allem Code, den du ausdrücklich für andere schreibst (wie hier).

"Ich komme damit klar" ist sowas wie "auf meinem Rechner läuft's".
Rudy Velthuis
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
3.045 Beiträge
 
Delphi 12 Athens
 
#9

AW: Interface richtig verstanden?

  Alt 5. Mai 2019, 08:43
"l" für lokal
Ich komme damit klar.
Das mag sein, aber hier muss ich mal doch Rudy zustimmen!
Man kann da sehr leicht was verwechseln...
  Mit Zitat antworten Zitat
exilant

Registriert seit: 28. Jul 2006
134 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Interface richtig verstanden?

  Alt 6. Mai 2019, 08:25
Nun möchte ich noch etwas tiefer in die Problematik Interface einsteigen.
Interfaces sind keine Problematik, sie sind eine Lösung.
Zum Glück meistens nicht die einzige Lösung. Und auch längst nicht immer die beste. [...duck und weg]
Anything, carried to the extreme, becomes insanity. (Exilant)
  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 22:59 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