AGB  ·  Datenschutz  ·  Impressum  







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

Zirkuläre Unit Reference

Ein Thema von Koolance · begonnen am 24. Nov 2006 · letzter Beitrag vom 28. Nov 2006
Antwort Antwort
Seite 3 von 3     123   
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#21

Re: Zirkuläre Unit Reference

  Alt 28. Nov 2006, 01:43
Zitat:
Warum ist das casten unzulässig?
Ein harter Cast, wie der in deinen Sourcen, ist generell unzulässig und absolut sinnfrei. Denn der Zeiger auf ein Interfaces ist immer unterschiedlich auf den Zeiger der implementerenden Klasse. Das mag für C++ Interfaces die direkt auch die implementieren de Klase darstellen anders sein (der einzgste Fall den ich kenne wo dies so ist). Aber bei Interfaces implementiert durch Borland Delphi PASCAL Klassen ist definitiiv der Zeiger auf ein Interface NICHT identisch mit dem Zeiger auf die Klasse.

Defakto ist der Zeiger auf das Interface ein Zeiger mit festen Offset relativ zum Zeiger auf die implementierende Instance der Klasse. Nachzulesen in Unit TypInfo.pas. Implementiert eine Klasse in Delphi sogar mehere Schnittstellen unterschiedlichen Types so unterscheiden sich sogar all diese Zeiger dieser Interfaces !!

Beispiel
Delphi-Quellcode:

type
  IInterface1 = interface;
  IInterface2 = interface;

  TMyImpl = class(TInterfacedObject, IInterface1, IInterface2)

var
  MyImpl: TMyImpl;
  MyInt1: IInterface1;
  MyInt2: IInterface2;
begin
  MyImpl := TMyImpl.Create;
  MyInt1 := MyImpl as IInterface1;
  MyInt2 := MyImpl as IInterface2;

  if (Pointer(MyImpl) = Pointer(MyInt1)) then // ist FALSE
  if (Pointer(MyImpl) = Pointer(MyInt2)) then // ist FALSE
  if (Pointer(MyInt1) = Pointer(MyInt2)) then // ist FALSE

// ergo:
  
  IInterface1(MyImpl).XYZ; // ist FALSCH
  IInterface2(MyImpl).XYZ; // ist FALSCH
  
  TMyImpl(MyInt1).XYZ; // ist FALSCH
  TMyImpl(MyInt2).XYZ; // ist FALSCH

  (MyImpl as IInterface1).XYZ; // ist RICHTIG, wenn IInterface1 eine GUID hätte, hat
  (MyImpl as IInterface2).XYZ; // ist RICHTIG, wenn IInterface2 eine GUID hätte, hat


  (MyInt1 as TMyImpl).XYZ; // ist FALSCH, da ein Interface keinen spzifischen Typ eines Implementor kennt, siehe Abstraktion oben
  (MyInt2 as TMyImpl).XYZ; // ist FALSCH, ....
end;
Ergo: die Frage ist nicht "warum unzulässig" sondern "überhaupt möhglich ?", und nein ist es nicht und erzeugt nur AVs und sonst nichts. Du versuchst nämlich damit nur aus einem Auto die Farbe Grün zu machen ohne irgendwelche Überprüfungen

Gruß Hagen
  Mit Zitat antworten Zitat
Koolance

Registriert seit: 28. Feb 2006
Ort: Kerpen
74 Beiträge
 
Delphi 6 Enterprise
 
#22

Re: Zirkuläre Unit Reference

  Alt 28. Nov 2006, 14:18
Erst mal vielen Dank für deine ausführlichen Antworten. Habe wieder echt was gelernt.

Zitat:
Wenn du davon überzeugt bist warum fragst du dann noch ? Ich meine, und damit bin ich nicht der Einzigste hier, das du mit dieser Meinung schon von vornherein deinen größten Fehler begehst. Begründungen siehe oben.
Ganz sicher war ich mir wohl doch noch nicht...
Die Interfacelösung habe ich verworfen.
Die Lösung über TObject habe ich ausprobiert und sie funktioniert sehr gut.

Die 3 Klassen-Lösung muss ich mal Komplett durchdenken, ich bin mir noch nicht sicher ob ich mit so mein Problem lösen kann.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#23

Re: Zirkuläre Unit Reference

  Alt 28. Nov 2006, 15:50
Zitat:
Die 3 Klassen-Lösung muss ich mal Komplett durchdenken, ich bin mir noch nicht sicher ob ich mit so mein Problem lösen kann.
Sinnvoll ist es darüber nachzudenken, aber je nach Notwendigkeiten lassen sich bestimmte Konstrukte nicht vermeiden. Und in diesem Moment benötigst du wieder Typcasts. Wichtig ist dann nur das du per as Typcastest auch wenn das bischen langsammer geht, dafür absolut sicher

Der Aufwand über abstrakte Vorfahrklassen ist nicht unerheblich, das muß man fairerweise sagen, und eben auch öfters nicht immer sauber umsetzbar. Auch da können dann Typcasts vorkommen.

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


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 08:53 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