Ich bin neu in der objektorientierten Programmierung und stoße immer wieder auf dieses Problem. (Ich programmiere in Java) Ich habe ein bisschen gezögert, danach zu fragen, da es so ein grundlegendes Problem zu sein scheint, aber ich kann hier keine Informationen dazu oder Fragen dazu finden und keine davon Lehrbücher, die ich gelesen habe (natürlich auf einer ziemlich einfachen Ebene), haben dieses Thema angesprochen:
Oft muss ich alle Objekte einer Klasse verfolgen, die erstellt wurden, um sie für verschiedene Zwecke zu durchlaufen. So wie ich derzeit Programme schreibe, werden viele Objekte nur von anderen Objekten referenziert, was bedeutet, dass ich kein Array oder keine Sammlung habe, mit der ich sie alle referenzieren kann.
Ich stelle mir vor, dass es, da dies in OOP eine so grundlegende Notwendigkeit zu sein scheint, einen recht institutionalisierten und einfachen Weg geben sollte, dies zu tun? Ist es üblich, eine separate Liste aller Objekte einer Klasse zu führen?
Ich dachte an ein statisches Array oder eine statische Sammlung, zu der durch ihren Konstruktor jedes neu erstellte Objekt hinzugefügt wird. Dies würde jedoch nicht mit Unterklassen funktionieren, da Konstruktoren nicht vererbt werden?
Mir ist klar, dass diese Frage möglicherweise keine einfache Antwort hat. Ich hoffe nur, dass mich jemand ein bisschen über dieses Thema aufklären kann. Ich habe das Gefühl, dass mir hier ein zentrales Wissen fehlt.
Antworten:
Ich weiß nicht, warum Sie eine Liste aller Instanzen einer Klasse führen müssen.
Dies würde zu einem Speicherverlust führen, da diese Objekte niemals entsorgt werden, da die Liste sie weiterhin referenziert, nachdem dies keine andere Klasse getan hat.
Aber wenn Sie diesem Weg wirklich folgen wollen:
Übrigens: Konstruktoren werden vererbt.
quelle
Es ist zu beachten, dass schwache Referenzen in Kombination mit den anderen angegebenen Lösungen verwendet werden können, damit der Garbage Collector verfolgte Objekte entsorgen kann, wenn sie nicht mehr an anderer Stelle referenziert werden. Dadurch werden Speicherverluste vermieden, ohne dass Code an anderer Stelle benötigt wird, um Objekte manuell zu entsorgen, oder auf andere Weise darauf zu achten, dass sie verfolgt werden. Sie können eine ReferenceQueue bereitstellen, um Benachrichtigungen über Verweise auf freigegebene Objekte zu erhalten.
Die Konstruktoren von Basisklassen werden vor Konstruktoren abgeleiteter Klassen aufgerufen. Jede Klasse hat mindestens einen Konstruktor und Konstruktoren können nicht überschrieben werden.
quelle
Wenn Leute Spiele machen, wollen sie manchmal eine "selbstverwaltende" Sammlung jeder Art von Spielobjekt.
Eine Implementierung sieht folgendermaßen aus:
Auf diese Weise können Methoden, die die Sammlung bearbeiten, als statisch deklariert werden, während nicht statische Methoden eine Instanz bearbeiten (updateAll vs. update).
Während dies für sehr einfache Szenarien in Ordnung ist , ist es bei mittlerer Komplexität normalerweise am besten, separate Managerklassen zu erstellen.
quelle
static ArrayList<ListeStatic> list = new ArrayList<ListeStatic>();
und die Statistik unterdrücken {..}uptdateAll(){..;}
Versuchen Sie, den Kontext zu denken. Wenn Sie ein Objekt erstellen, tun Sie dies in einem bestimmten Kontext. Wenn es in Ihrem Spiel beispielsweise darum geht, Aliens zu schießen, erstellt Ihre App ständig neue Alien-Objekte. Sie werden in einem Feld namens Space angezeigt (dies könnte die Klasse sein, die die Hauptbenutzeroberfläche darstellt).
Es ist für Space völlig selbstverständlich, eine Eigenschaft namens currentAliens zu haben, bei der es sich um ein Array handelt, zu dem Sie jedes neue Alien hinzufügen, das Sie erstellen. Wenn Sie Ihrem Benutzer erlauben möchten, die Struktur der Raumzeit auseinander zu reißen und alle Aliens gleichzeitig zu zerstören, würden Sie diese Sammlung durchlaufen und jedes Objekt zerstören.
Wenn Sie von anderen Teilen Ihrer App aus auf diese Sammlung von Aliens zugreifen möchten (z. B. von einer Einstellungsseite aus, auf der Benutzer möglicherweise bestimmte Arten von Aliens auf einen Schlag auslöschen möchten), wird Ihr Einstellungskontext angezeigt müssen Zugriff auf das Space-Objekt erhalten.
quelle