Klassenextension: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Wechseln zu:Navigation, Suche
(Bemerkungen)
(Beispiel)
Zeile 12: Zeile 12:
 
===Beispiel===
 
===Beispiel===
 
Gerade in der Spieleprogrammierung ist es häufig wichtig, dass auch der Programmierer einen direkten Zugang zur Extension einer Klasse hat
 
Gerade in der Spieleprogrammierung ist es häufig wichtig, dass auch der Programmierer einen direkten Zugang zur Extension einer Klasse hat
(zum Beispiel zur Extension der Klasse <code>Combatant</code> der Spielgegner). Dies kann mit Hilfe von [[Klassenmethoden]] ganz einfach relaisiert werden.
+
(zum Beispiel zur Extension der Klasse <code>Combatant</code> der Spielgegner).  
 +
Dies kann zum Beispiel mit Hilfe von [[Klassenmethoden]] ganz einfach realisiert werden.
  
 
Im folgenden Beispiel wird die Extension der Klasse <code>Combatant</code>
 
Im folgenden Beispiel wird die Extension der Klasse <code>Combatant</code>
 
in einem statischen Attribut <code>extension</code> (der Art <code>Dictionary</code>) zur Verfügung gestellt.
 
in einem statischen Attribut <code>extension</code> (der Art <code>Dictionary</code>) zur Verfügung gestellt.
 
Jedes Mal, wenn ein neues Objekt erzeugt wird, fügt der [[Konstruktor]] dieses
 
Jedes Mal, wenn ein neues Objekt erzeugt wird, fügt der [[Konstruktor]] dieses
neue Objekt automatisch in die Extension ein. Das automatische Löschen von Elementen aus der Extension
+
neue Objekt automatisch in die Extension ein.
ist in Sprachen mit Garbage Collection etwas mühsam, in Sprachen wie C++ kann diese Aufgabe jedoch
 
problemlos von [[Destruktor]] übernommen werden. In Sprachen wie ActionScript oder Java müssen eigene
 
Delete-Operationen (z.B. als statische Methoden) implementiert werden.
 
 
    
 
    
 
<source lang="actionscript3">
 
<source lang="actionscript3">
Zeile 40: Zeile 38:
 
}
 
}
 
</source>
 
</source>
 +
 +
Das Löschen von Elementen aus der Extension
 +
kann und sollte in Sprachen wie C++ von [[Destruktor]] übernommen werden.
 +
In Sprachen wie ActionScript oder Java müssen eigene
 +
Delete-Operationen implementiert werden.
 +
 +
Vorzugsweise als Objektmethode, die auf das zu löschende Objekt angewendet wird:
 +
 +
<source lang="actionscript3">
 +
  public function delete(): void
 +
  {
 +
    delete sv_extension[this];
 +
  }
 +
</source>
 +
 +
Aber auch der Einsatz einer Klassenmethode (statische Methode) ist möglich:
 +
 +
<source lang="actionscript3">
 +
  public static function delete(p_combatant: Combatant): void
 +
  {
 +
    delete sv_extension[combatant];
 +
  }
 +
</source>
 +
 +
In beiden Fällen muss der Programmierer jedoch zusätzlich dafür Sorge tragen, dass
 +
auch alle übrigen Verweise auf das zu löschende Objekt entfernt wurden, damit der
 +
Garbage Collector das Objekt auch wirklich löschen kann.
 +
 +
===Weitere Möglichkeiten===
 +
 +
Es existieren natürlich noch weitere Möglichkeiten, um den expliziten Zugriff auf eine Klassenextension zu realisieren.
 +
 +
Beispielsweise kann man eine eigenständige
 +
Klasse <code>Extension</code> definieren, die den Zugriff auf Klassenextensionen
 +
über eine Methode <code>extension(p_class: Class): Dictionary</code> erlaubt.
 +
 +
Oder man definiert für jede Klasse, auf deren Extension man zugreifen möchte, eine
 +
eigene Singleton-Klasse <code>CombatantExtension</code> bzw. <code>Extension<Combatant></code>.
  
 
=Quellen=
 
=Quellen=

Version vom 25. Februar 2011, 11:12 Uhr

1 Definition (von W. Kowarschick)[1]

Die zu einer Klasse gehörende Klassenextension ist eine (i. Allg. endliche) Menge, die zu jedem Zeitpunkt genau diejenigen Objekte, die der Klasse zugeordnet sind, enthält.

2 Bemerkungen

Der Begriff der Klassenextension ist zunächst einmal für die formales Definition des Begriffes Klasse von großem Vorteil. Aber auch für die Implementierung von Programmsystemen und Anwendungen ist dieser Begriff wichtiger, als man zunächst meinen könnte (da viele objektorientierte Sprachen keinen direkten Zugriff auf die Klassenextension realisieren). Viele objektorientierte Programmiersprachen verwalten die Klassenextension explizit (ohne dem Programmierer einen direkten Zugang zu gewähren) — zum Beispiel, damit ein Garbage Collector korrekt arbeiten kann.

Objektorientierte Datenbanksysteme machen die Klassenextension dagegen immer allen Benutzern zugänglich, die die entsprechenden Rechte haben. In derartigen Systemen wird an Stelle des Begriffs Klassenextension üblicherweise der Begriff Tabelle verwendet. Die dauerhafte Speicherung von Daten in Tabellen ist die wesentliche Aufgabe eines jeden Datenbanksystems.

2.1 Beispiel

Gerade in der Spieleprogrammierung ist es häufig wichtig, dass auch der Programmierer einen direkten Zugang zur Extension einer Klasse hat (zum Beispiel zur Extension der Klasse Combatant der Spielgegner). Dies kann zum Beispiel mit Hilfe von Klassenmethoden ganz einfach realisiert werden.

Im folgenden Beispiel wird die Extension der Klasse Combatant in einem statischen Attribut extension (der Art Dictionary) zur Verfügung gestellt. Jedes Mal, wenn ein neues Objekt erzeugt wird, fügt der Konstruktor dieses neue Objekt automatisch in die Extension ein.

public class Combatant
{
  private static var sv_extension: Dictionary = new Dictionary(); 
  //besser wäre: Dictionary<Combatant>, wird aber von Actionscript 3 nicht unterstützt
    
  public static function get extension(): Dictionary
  {
    return sv_extension;
  }
    
  public function Combatant(...)
  {
    sv_extension[this] = this;
    ...
  }
}

Das Löschen von Elementen aus der Extension kann und sollte in Sprachen wie C++ von Destruktor übernommen werden. In Sprachen wie ActionScript oder Java müssen eigene Delete-Operationen implementiert werden.

Vorzugsweise als Objektmethode, die auf das zu löschende Objekt angewendet wird:

  public function delete(): void
  {
    delete sv_extension[this];
  }

Aber auch der Einsatz einer Klassenmethode (statische Methode) ist möglich:

  public static function delete(p_combatant: Combatant): void
  {
    delete sv_extension[combatant];
  }

In beiden Fällen muss der Programmierer jedoch zusätzlich dafür Sorge tragen, dass auch alle übrigen Verweise auf das zu löschende Objekt entfernt wurden, damit der Garbage Collector das Objekt auch wirklich löschen kann.

2.2 Weitere Möglichkeiten

Es existieren natürlich noch weitere Möglichkeiten, um den expliziten Zugriff auf eine Klassenextension zu realisieren.

Beispielsweise kann man eine eigenständige Klasse Extension definieren, die den Zugriff auf Klassenextensionen über eine Methode extension(p_class: Class): Dictionary erlaubt.

Oder man definiert für jede Klasse, auf deren Extension man zugreifen möchte, eine eigene Singleton-Klasse CombatantExtension bzw. Extension<Combatant>.

3 Quellen


Dieser Artikel ist GlossarWiki-konform.