AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi Elegantere Lösung um in dieser Struktur eine zirkuläre referenz zu umgehen?
Thema durchsuchen
Ansicht
Themen-Optionen

Elegantere Lösung um in dieser Struktur eine zirkuläre referenz zu umgehen?

Ein Thema von moritzm123 · begonnen am 16. Sep 2016 · letzter Beitrag vom 17. Sep 2016
Antwort Antwort
moritzm123

Registriert seit: 5. Sep 2016
1 Beiträge
 
#1

Elegantere Lösung um in dieser Struktur eine zirkuläre referenz zu umgehen?

  Alt 16. Sep 2016, 14:09
Hallo,

zunächst ein Funfact: Wenn man in der Delphi Praxis Snake sucht, bekommt man 8 Seiten Suchergebnisse

Ich habe folgende simple Klassenstruktur:

Die Form hat eine Instanz von TFood, nennen wir sie "Food"
Die Form hat eine Instanz von TSnake, nennen wir sie "Snake"

Nun gibt es das Problem dass ich nicht weiß wo ich die Kollisionsabfrage prüfen soll da:
TFood nicht über die Informationen der Instanz Snake hat.
TSnake nicht die Informationen der Instanz Food hat.
TForm hat eigentlich nicht die Aufgabe hat auf Kollisionen zu prüfen. Sie soll ja eigentlich nur Nutzereingaben erhalten und Ausgaben tätigen.

Ich hatte jetzt vor eine Klasse TSpielfeld zu erstellen um die Kollision auszulagern. Dieses Spielfeld hätte jetzt die Instanz Food und Snake.
Das Problem ist ja, die Kollision soll nur stattfinden wenn sich die Schlange bewegt. Dieses Problem wollte ich mithilfe eines TNotifyEvents in TSnake lösen.
Dieses Event würde immer dann feuern, wenn sich die Schlange bewegt, so könnte ich dann die Kollision in TSpielfeld starten.


Meine Frage ist: Hat jemand eine elegantere Lösung, oder ist diese Lösung so in Ordnung?
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Elegantere Lösung um in dieser Struktur eine zirkuläre referenz zu umgehen?

  Alt 16. Sep 2016, 14:13
würde etwas wie folgt erwarten ....

Delphi-Quellcode:

MyForm = class (TForm)


    aSnakeSpiel : TSpiel;
  

end;



Tspiel = class

   
   aSnake : TSnake ;
   aFood : TFood ;



   procedure PlayTheGame ;


end;

TSpiel.PlayTheGame
begin
     .....
end;
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

AW: Elegantere Lösung um in dieser Struktur eine zirkuläre referenz zu umgehen?

  Alt 16. Sep 2016, 17:39
Ich glaube du suchst nach Forward-Declarations:

Delphi-Quellcode:
type
  TClassB = class;
  
  TClassA = class(TObject)
  private
    FB: TClassB;
  end;

  TClassB = class(TObject)
  private
    FA: TClassA;
  end;
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Elegantere Lösung um in dieser Struktur eine zirkuläre referenz zu umgehen?

  Alt 17. Sep 2016, 06:43
Das Problem ist ja, die Kollision soll nur stattfinden wenn sich die Schlange bewegt. Dieses Problem wollte ich mithilfe eines TNotifyEvents in TSnake lösen.
Dieses Event würde immer dann feuern, wenn sich die Schlange bewegt, so könnte ich dann die Kollision in TSpielfeld starten.

Meine Frage ist: Hat jemand eine elegantere Lösung, oder ist diese Lösung so in Ordnung?
Das hört sich sehr sinnvoll an, ja.
TSnake und TFood sollten nichts von einander wissen, das ist nicht deren Aufgabe. Dein Spielfeld kann auf diese Informationen zugreifen und das ganze moderieren.

Egal wie du das verpackst, ob mit Events oder mit Interfaces, die Lösung wird immer vom Prinzip her so oder so ähnlich sein. Denn sobald du TSnake oder TFood etwas von dieser Funktionalität gibst, müssen sie Informationen über das Spielfeld und ihre Nachbarn bekommen, so dass die Kapselung aufgeweicht wird.
Sebastian Jänicke
AppCentral
  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 01:16 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