![]() |
[Interfaces]: Anwendungsbeispiel
Weiss zwar wie Interfaces funktionieren,
finde aber selbst keine guten Anwendungsbeispiele, d.h. ich möchte ein Interface in eine meiner Anwendungen implementieren, weiss aber nicht wo. :-D Danke :-D |
Re: [Interfaces]: Anwendungsbeispiel
Interfaces mit COM oder einfach nur Delphi-Interfaces?
Die Delphi Interfaces eignen sich immer dann, wenn du zwei Units hast, die sich aber beide im interface-Abschnitt brauchen, was ja nicht geht. Dann kann man ein Interface erstellen auf das dann beide Zugreifen, die eine implementierend und die andere nutzend. |
Re: [Interfaces]: Anwendungsbeispiel
*push* :-D
|
Re: [Interfaces]: Anwendungsbeispiel
Zitat:
mfG mirage228 |
Re: [Interfaces]: Anwendungsbeispiel
das ist genau wie: ich möchte einen button in meinem projekt implentieren, weiß aber net wo ! ;)
das kommt doch darauf an was du damit machen willst ! ^^ |
Re: [Interfaces]: Anwendungsbeispiel
Vor allem: beantworte mal die Frage von jbg. Wenn Du das nicht kannst, dann hast Du Interfaces noch nicht einmal ansatzweise verstanden :roll:
...:cat:... |
Re: [Interfaces]: Anwendungsbeispiel
Ich meine Interfaces in bezug auf OOP!
Ich habe öfters in meinen Projekten größere Klassenstrukturen. Nun möchte ich diese mit teilweise mit Interfaces statt Klassen ausstatten, welche Vorteile hätte ich damit? Bitte auch ein paar Anwendungsbeispiele (Klassen wo sich ein Interface eigenen würde). Danke |
Re: [Interfaces]: Anwendungsbeispiel
*push* :-D
|
Re: [Interfaces]: Anwendungsbeispiel
Wenn du Interfaces statt Klassen nimmst, musst du dich nicht darum kümmern, wann und wie dein Objekt freigegeben wird. Sinnvol ist das zum Beispiel, wenn du ein Objekt nur kurz brauchst, dann nimmt dir das Interface fast die gesamte Arbeit ab. ;)
|
Re: [Interfaces]: Anwendungsbeispiel
Ich bräuchte ein Beispiel wo ich statt einer normalen Klasse,
besser ein Interface nehmen sollte (eventuelle Code). Danke Dann hätte ich ein gutes Anwendungsbeispiel! :-D |
Re: [Interfaces]: Anwendungsbeispiel
Interfaces machen dann Sinn, wenn du Mehrfachvererbung (zwecks polymorphem Verhalten) nachbilden willst, denn eine Klasse kann in OPascal nur von einer erben, aber beliebig viele Interfaces implementieren.
Edit: Ein Interface kannst du dir als eine abstrakte Klasse ohne Felder, bei der alle Methoden abstrakt sind. |
Re: [Interfaces]: Anwendungsbeispiel
Zitat:
Da bieten sich 'tausende' sachen an, die auf den ersten blick garnicht danach aussehen :cyclops: |
Re: [Interfaces]: Anwendungsbeispiel
Delphi-Quellcode:
ich hoffe das beantworte die eigentliche frage ein wenig :)
Type
ixyz = interface [guid] procedure tutwat; stdcall; end; TXYZ = Class(TInterfacedObject, IXYZ) privat protected public procedure tutwat; stdcall; end; Var tmp : ixyz; ixyz = TXYZ.Create(); ixyz.tutwat; |
Re: [Interfaces]: Anwendungsbeispiel
Ja danke :-D
@maximov: Könntest du dieses Observer-Zeug genauer erklären? @HeikoDD: Ich weiss wie ich dass ganze deklariere, danke! Bitte weitere Beispiele, danke! :oops: |
Re: [Interfaces]: Anwendungsbeispiel
*push* :firejump:
|
Re: [Interfaces]: Anwendungsbeispiel
Zitat:
Zitat:
Delphi-Quellcode:
Jedes object, das INotifyable implemntiert kann sich nun bei dem IObserveable-objekt anmelden und wenn es seinen zustand ändert, dann werden alle Notifications, von allen INotifyable-objekten auf gerufen.
type
INotifyable = interface procedure Notification(const NotifyArg:TNotifyArg); end; IObserveable = interface procedure AddObserver(const aObserver:INotifyable); procedure RemoveObserver(const aObserver:INotifyable); end; Hätte man hier keine interfaces, so müssten sowohl, die procedure von INotifyable, als auch die von IObserveable, tief in der klassen-hierarchie vergraben sein, damit möglichst viele objekte diese fähigkeit besitzen. Das würde aber zu einer starren klassenabhängigkeit führen, mit der man soweiso immer schon kämpfen muss. Interfaces können also dieses problem auflockern und bieten eine prima möglichkeit 'Quer-Einsteiger-funktionalitäten' umzusetzen :wink: |
Re: [Interfaces]: Anwendungsbeispiel
Könntest du mit der Erklärung noch etwas weiter gehen, wass dann folgen würde.
Was ist eine 1 zu n - Beziehung? Danke, maximov :-D |
Re: [Interfaces]: Anwendungsbeispiel
Hi,
ich glaube er meint, dass 1 bis n Objekte als Observer an diesem Objekt hängen und dann über das Interface sich eintragen und über das andere Interface benachrichtigt werden. mfG mirage228 |
Re: [Interfaces]: Anwendungsbeispiel
Zitat:
|
Re: [Interfaces]: Anwendungsbeispiel
Zitat:
|
Re: [Interfaces]: Anwendungsbeispiel
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ich glaube maximov meint soetwas wie dies hier.
Delphi-Quellcode:
TObserver implementiert das INotifyable Interface. Dadurch kann eine Instanz von TObserver den Methoden AddObserver und RemoveObserver von TMessanger übergeben werden.
unit observer;
interface uses SysUtils, classes; Type TNotifyArg = class(TObject) private FMessageText: String; public property MessageText : String read FMessageText write FMessageText; end; TObserverNotifycation = procedure(Sender : TObject; MsgText : String) of object; INotifyable = interface ['{6D8909ED-865B-4F92-A5E5-92195B5FB53D}'] procedure Notification(const NotifyArg:TNotifyArg); function GetNotify : TObserverNotifycation; procedure SetNotify(const Value : TObserverNotifycation); property OnNotify : TObserverNotifycation read GetNotify write SetNotify; end; IObserveable = interface ['{D3EB90E2-4D09-4900-A61A-A5AB3D6E4E4B}'] procedure AddObserver(const aObserver:INotifyable); procedure RemoveObserver(const aObserver:INotifyable); end; TObserver = class(TInterfacedObject,INotifyable) private FOnNotify: TObserverNotifycation; function GetNotify : TObserverNotifycation; procedure SetNotify(const Value : TObserverNotifycation); public procedure Notification(const NotifyArg:TNotifyArg); property OnNotify : TObserverNotifycation read GetNotify write SetNotify; end; TMessanger = class(TInterfacedObject, IObserveable) private FList : IInterfaceList; public constructor Create; destructor Destroy; override; procedure Notify; procedure AddObserver(const aObserver:INotifyable); procedure RemoveObserver(const aObserver:INotifyable); end; implementation { TObserver } function TObserver.GetNotify: TObserverNotifycation; begin Result:=FOnNotify; end; procedure TObserver.SetNotify(const Value: TObserverNotifycation); begin FOnNotify:=Value; end; procedure TObserver.Notification(const NotifyArg: TNotifyArg); begin If Assigned(OnNotify) then FOnNotify(Self,NotifyArg.MessageText); end; { TMessanger } constructor TMessanger.Create; begin inherited Create; FList:=TInterfaceList.Create; end; destructor TMessanger.Destroy; begin inherited Destroy; end; procedure TMessanger.AddObserver(const aObserver: INotifyable); begin FList.Add(aObserver); end; procedure TMessanger.RemoveObserver(const aObserver: INotifyable); begin FList.Remove(aObserver); end; procedure TMessanger.Notify; var iCnt : Integer; NotifyArg : TNotifyArg; begin For iCnt := 0 to FList.Count-1 do begin NotifyArg:=TNotifyArg.Create; Try NotifyArg.MessageText:='Notifycation_'+IntToStr(iCnt+1); // as ruft hier implizit QueryInterface auf (FList[iCnt] as INotifyable).Notification(NotifyArg); Finally NotifyArg.Free; end; end; end; end. Interessant ist an der Realisierung mit Interfaces, das man auch ein TEdit als Observer bei FMessanger anmelden kann.
Delphi-Quellcode:
siehe Beispiel.
TObserverEdit = class(TEdit,INotifyable)
Wenn ich die Sache richtig verstanden habe können alle Nachfahren von TComponent über Interfaces sehr einfach mit der Observerfähigkeit nachgerüstet werden. Eigene Klassen sollten Nachfahren von TInterfacedObject sein. Kickt im Beispiel ein paar mal auf den Button "AddObserver" und einmal auf den Button "Create Edit and Add". Anschließend auf den Button "Notify" |
Re: [Interfaces]: Anwendungsbeispiel
Zitat:
Dies wäre eine mögliche technik Observer umzusetzen. In .Net wäre zB. ein Multicast-event geeignet. Oder die VCL hat einen Observer in TComponent, direkt in der klassenstruktur verbuddelt (RegisterNotification). Wobei auch verschiedenste nachrichten verschickt werden können; anstatt der sehr anschaulichen text-botschaft können die objekte auch ereignis-codes, klassen, befehle etc. austauschen, um auf dem neuesten stand zu bleiben. Wobei Observer hier eigentlich OT sind :cyclops: mfg, masimov. PS: Der vollständigkeit halber, muss man hier noch auf den Ref-counter aufpassen, oder gleich eine InterfaceListe verwenden. Zitat:
|
Re: [Interfaces]: Anwendungsbeispiel
Hi !
Zitat:
:duck: Zitat:
.. Maximov, Du hast Recht, es ist eine mögliche Umsetzung, wenn nicht gar die schlechteste. Das .NET MulticastEvent ist wirklich gut geeignet, allerdings gibts schon seit längerem eine Multicast Umsetzung in Delphi. ![]() ( Der Ordner Multicas ist der interessante ! ) Mit 3, 4, 5 Befehlen und der Erzeugung von TMulticaster hat man das ganze implementiert. mfg stoxx |
Re: [Interfaces]: Anwendungsbeispiel
[quote="maximov"]PS: Der vollständigkeit halber, muss man hier noch auf den Ref-counter aufpassen, oder gleich eine InterfaceListe verwenden.
Zitat:
|
Re: [Interfaces]: Anwendungsbeispiel
Zitat:
|
Re: [Interfaces]: Anwendungsbeispiel
Zitat:
[OT]Wobei mich die möglichkeit von win32 multicasts nicht überrascht, da mit klassen eh irgendwie alles möglich ist und ich selbst auch schon Multicaster geschrieben habe.[/OT] :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:13 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