AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Interface und Objektreferenz offenbar noch nicht verstanden
Thema durchsuchen
Ansicht
Themen-Optionen

Interface und Objektreferenz offenbar noch nicht verstanden

Ein Thema von Hepdepaddel · begonnen am 18. Sep 2015 · letzter Beitrag vom 30. Sep 2015
Antwort Antwort
TiGü

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

AW: Interface und Objektreferenz offenbar noch nicht verstanden

  Alt 24. Sep 2015, 13:50
Delphi-Quellcode:
var
  Summary: TMySummary;
begin
  Summary:=TMySummary.Create;
  Summary.Init;
  ProjectData.CallEnumeratorForAllElements(Summary as IPlanDataEnumerator);
  StatusBar.Panels[1].Text:='Unassigned Order Packages: '+IntToStr(Summary.CountUnassignedOrderPackages);
  StatusBar.Panels[2].Text:='Unassigned Orders: '+IntToStr(Summary.CountUnassignedOrders);
end;
Uff, soviel Text und dein Problem ist dabei ganz einfach:
Verwende NICHT die Objektinstanzen, sondern nur die Interfaceinstanzen.

Vergleiche den von mir zitierten Abschnitt nochmal ganz genau mit meinen Quelltext aus dem Post davor (Tipp: Schaue die Variablen-Deklaration an).

Und ggf. auch nochmal zum nachlesen:
http://www.nickhodges.com/page/Why-Y...eferences.aspx
  Mit Zitat antworten Zitat
Benutzerbild von Hepdepaddel
Hepdepaddel

Registriert seit: 12. Dez 2005
Ort: Bremen
91 Beiträge
 
Delphi 2006 Enterprise
 
#2

AW: Interface und Objektreferenz offenbar noch nicht verstanden

  Alt 30. Sep 2015, 13:55
Zitat:
Uff, soviel Text und dein Problem ist dabei ganz einfach:
Verwende NICHT die Objektinstanzen, sondern nur die Interfaceinstanzen.

Vergleiche den von mir zitierten Abschnitt nochmal ganz genau mit meinen Quelltext aus dem Post davor (Tipp: Schaue die Variablen-Deklaration an).

Und ggf. auch nochmal zum nachlesen:
http://www.nickhodges.com/page/Why-Y...eferences.aspx
[/QUOTE]


Sorry für den vielen Text - ich wollte nur den Hintergrund schildern, weswegen mir abgeleitete Interfaces nicht reichen und ich gerne auch auf Objektmethoden zugreifen würde.

Den Text von Nick kannte ich - das Buch liegt hier - aber der beschreibt leider nur die einfachen Fälle. Und dass Du die Variable als Interface deklariert hattest, hatte ich gesehen, das Casting fand ich nur unglücklich. Wenn man ein TForm mit Interfaces ausstatten will, müsste man zudem ein Interface schreiben, das alle von außen genutzten Methoden (z.B. ShowModal) beinhaltet, damit man das Formular anzeigen kann, es weitere Interface-Methoden ansprechen kann und Reference Count dennoch funktioniert. Ergibt sicher Sinn, die Logik "wenn ein Objekt irgendein Interface implementiert, dann sollten auch alle anderen Methoden des Objekts, die man nutzen will, über ein Interface verwendet werden" war mir noch nicht so klar.

Nochmals besten Dank!
  Mit Zitat antworten Zitat
TiGü

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

AW: Interface und Objektreferenz offenbar noch nicht verstanden

  Alt 30. Sep 2015, 15:20
Wenn man ein TForm mit Interfaces ausstatten will, müsste man zudem ein Interface schreiben, das alle von außen genutzten Methoden (z.B. ShowModal) beinhaltet, damit man das Formular anzeigen kann, es weitere Interface-Methoden ansprechen kann und Reference Count dennoch funktioniert.
Nein, muss man für den Fall einer TComponent/TForm eben nicht.
Hier kann auch einfach geprüft (is-Operator) und gecastet werden (as-Operator), ohne das dir irgendetwas kaputt geht, weil der Reference Counting Mechanismus für TComponent anderes implementiert ist, als bspw. für TInterfaceObject.

Wenn es also heißt:
Delphi-Quellcode:
type
  TDeineForm = class(TCustomForm, IEineFunktionalität, IEineAndereFunktionalität)
...
Dann kannst du problemlos folgendes tun:
Delphi-Quellcode:
var
  MeineInstanz : IEineFunktionalität;
  LokalesForm : TForm;
begin
...
if MeineInstanz is TForm then
begin
  LokalesForm := MeineInstanz as TForm; // oder TForm(MeineInstanz), wenn wirklich durch is-Operator oder Supports(...) geprüft wurde
  LokalesForm.ShowModal;
...
end;

Ergibt sicher Sinn, die Logik "wenn ein Objekt irgendein Interface implementiert, dann sollten auch alle anderen Methoden des Objekts, die man nutzen will, über ein Interface verwendet werden" war mir noch nicht so klar.
Nochmal: Du muss nicht alle Methoden, Properties und Anhängsel einer Klasse im Interface abbilden.
Das wäre sonst sehr sehr falsch!
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Interface und Objektreferenz offenbar noch nicht verstanden

  Alt 30. Sep 2015, 16:21
Das mit dem Casten sollte man sich aber auch genau überlegen und nicht als generellen UseCase abspeichern.

Es gibt Fälle, wo man das gefahrlos machen kann und andere, wo man damit auf die Nase fällt.

Generell sollte ein Interface alles das liefern was benötigt wird um damit zu arbeiten. Ansonsten fragt man einfach per Delphi-Referenz durchsuchenSystem.SysUtils.Support nach, ob da noch ein weiteres Interface unterstützt wird.

Aber es macht keinen Sinn ein Monster-Interface zu erschaffen. Besser sind dort kleine aber feine, die man dann an unterschiedliche Klassen hängen kann.
Delphi-Quellcode:
IShowView = interface
  function GetVisible;
  property Visible: Boolean read GetVisible;
  procedure Show;
  procedure Hide;
end;

IShowModalView = interface
  function ShowModal: TModalResult;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (30. Sep 2015 um 16:27 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:47 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 by Thomas Breitkreuz