Klassenextension: Unterschied zwischen den Versionen

aus GlossarWiki, der Glossar-Datenbank der Fachhochschule Augsburg
Keine Bearbeitungszusammenfassung
 
(9 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
=Definition (von W. Kowarschick)<ref>[[Kowarschick, W.: Multimedia-Programmierung]]</ref>=
{{Qualität
|correctness        = 3
|extent              = 4
|numberOfReferences  = 1
|qualityOfReferences = 4
|conformance        = 5
}}
 
==Definition (W. Kowarschick<ref>{{Quelle|Kowarschick, W.: Multimedia-Programmierung}}</ref>)==
Die zu einer [[Klasse (OOP)|Klasse]] gehörende [[Klassenextension]] ist eine (i. Allg. endliche) Menge, die zu jedem Zeitpunkt genau diejenigen Objekte, die der Klasse zugeordnet sind, enthält.
Die zu einer [[Klasse (OOP)|Klasse]] gehörende [[Klassenextension]] ist eine (i. Allg. endliche) Menge, die zu jedem Zeitpunkt genau diejenigen Objekte, die der Klasse zugeordnet sind, enthält.


=Bemerkungen=
==Bemerkungen==
Der Begriff der [[Klassenextension]] ist zunächst einmal für die formales Definition des Begriffes [[Klasse (OOP)|Klasse]] von großem Vorteil.
Der Begriff der [[Klassenextension]] ist zunächst einmal für die formales Definition des Begriffes [[Klasse (OOP)|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
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).
da die meisten 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.
Viele objektorientierte Programmiersprachen verwalten die Klassenextension dennoch explizit  
(ohne dem Programmierer einen direkten Zugang zu gewähren) — zum Beispiel, damit ein [[Garbage Collector]] korrekt arbeiten kann.
 
[[Objektorientiertes Datenbanksystem|Objektorientierte Datenbanksysteme]] machen die Klassenextension
dagegen immer allen denjenigen 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 ja gerade die wesentliche Aufgabe eines jeden [[Datenbanksystem]]s.
 
Aber auch in Anwendungen, wie z.B. bei der Programmierung von Computerspielen,
ist es häufig wichtig, dass der Programmierer einen direkten Zugang zur Extension einer Klasse hat.
Wenn der Programmierer beispielsweise direkt auf die Extension der Klasse <code>Combatant</code> der Spielgegner
zugreifen kann, kann er diesen bei Spielende die Nachricht zukommen lassen, dass sie sich alle auflösen
oder sonstwie die Bühne verlassen. 


[[Objektorientiertes Datenbanksystem|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 [[Datenbanksystem]]s.
Der direkte Zugriff auf die Extension einer Klasse s kann auf mehrere Arten relativ einfach realisiert werden:
* Mittels [[Klassenmethoden]] (siehe nachfolgendes Beispiel).
* Mittels einer [[Singleton-Klasse]] (z.B. <code>Extension</code>), die den Zugriff auf Klassenextensionen über eine Methode <code>extension(p_class: Class): Dictionary</code> ermöglicht.
* Mittels einer eigenen Singleton-Klasse für jede Klasse, auf deren Extension man zugreifen möchte (z.B. <code>CombatantExtension</code> oder auch <code>Extension<Combatant></code>).


===Beispiel===
===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 <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.
Zeile 24: Zeile 43:
{
{
   private static var sv_extension: Dictionary = new Dictionary();  
   private static var sv_extension: Dictionary = new Dictionary();  
   //besser wäre: Dictionary<Combatant>, wird aber von Actionscript 3 nicht unterstützt
   //besser wäre: Dictionary<Combatant>; dies wird aber von Actionscript 3 nicht unterstützt
      
      
   public static function get extension(): Dictionary
   public static function get extension(): Dictionary
Zeile 38: Zeile 57:
}
}
</source>
</source>
Man beachte, dass <code>extension</code> nicht als Array, sondern als Dictionary realisert wurde,
damit das Löschen von Elementen aus der Extension besonders effizient implementiert werden kann.
Diese Löschen kann und sollte in Sprachen wie C++ von [[Destruktor]] übernommen werden.
In Sprachen mit Garbage Collector (wie ActionScript oder Java) müssen dagegen eigene
Delete-Operationen implementiert werden.


Das Löschen von Elementen aus der Extension
Vorzugsweise sollte eine Objektmethode <code>delete</code> definiert werden,
kann und sollte in Sprachen wie C++ von [[Destruktor]] übernommen werden.
die jeweils auf das zu löschende Objekt angewendet wird:
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">
<source lang="actionscript3">
Zeile 63: Zeile 83:


In beiden Fällen muss der Programmierer jedoch zusätzlich dafür Sorge tragen, dass
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  
auch alle übrigen Verweise auf das zu löschende Objekt entfernt werden, damit der  
Garbage Collector das Objekt auch wirklich löschen kann.
Garbage Collector das Objekt auch wirklich löschen kann.


===Weitere Möglichkeiten===
===Subklassen===
 
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
Laut [[Klasse (OOP)#Subklasse|Definition]] ist die Extension einer Subklasse B Teilmenge der Extension der zugehörigen Superklasse A. Insbesondere besteht die Extension einer
eigene Singleton-Klasse <code>CombatantExtension</code> bzw. <code>Extension<Combatant></code>.
[[Klasse (OOP)#Abstrakte_Klasse|Abstrakten Klasse]] oder eines [[Klasse (OOP)#Schnittstelle_.28Interface.29|Interfaces]]
aus der Vereinigung der Extensionen aller nicht-abstrakten Subklassen, d.h. aller Subklassen, die eine eigenene
Extension haben.


=Quellen=
Die Implementierung der Extensionsverwaltung einer Klassenhierarchie ist nicht wesentlich
aufwendiger, als die Implementierung der Extensionsverwaltung einer einzelnen Klasse.
Falls man die Extension eines Interfaces benötigt, kann man die oben vorgestellte
Extensionverwaltung auf Basis von Klassenmethoden nicht verwenden,
da Interfaces in der Regel keine statischen Methoden unterstützen. Hier muss man eine
der anderen zuvor genannten Alternativen wählen.


*[[Kowarschick, W.: Multimedia-Programmierung]]
==Quellen==
*[[Kowarschick, W. (2002): Multimedia-Programmierung - Objektorientierte Grundlagen]]
<references/>
<ol start="2">
<li>{{Quelle|Kowarschick, W. (2002): Multimedia-Programmierung - Objektorientierte Grundlagen}}</li>
</ol>


<noinclude>[[Kategorie:Objektorientierte Programmierung]]
<noinclude>[[Kategorie:Objektorientierte Programmierung]]
[[Kategorie:Glossar]][[Kategorie:Programmierung]]
[[Kategorie:Glossar]]
[[en:Class (OOP)]]
[[en:Class (OOP)]]
[[Kategorie:Kapitel:Multimedia-Programmierung]]
[[Kategorie:Kapitel:Multimedia-Programmierung]]
{{{{SITENAME}}-konformer Artikel}}</noinclude>
</noinclude>

Aktuelle Version vom 3. August 2019, 14:32 Uhr

Dieser Artikel erfüllt die GlossarWiki-Qualitätsanforderungen nur teilweise:

Korrektheit: 3
(zu größeren Teilen überprüft)
Umfang: 4
(unwichtige Fakten fehlen)
Quellenangaben: 1
(fehlen großteils)
Quellenarten: 4
(sehr gut)
Konformität: 5
(ausgezeichnet)

Definition (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.

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 die meisten objektorientierte Sprachen keinen direkten Zugriff auf die Klassenextension realisieren. Viele objektorientierte Programmiersprachen verwalten die Klassenextension dennoch 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 denjenigen 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 ja gerade die wesentliche Aufgabe eines jeden Datenbanksystems.

Aber auch in Anwendungen, wie z.B. bei der Programmierung von Computerspielen, ist es häufig wichtig, dass der Programmierer einen direkten Zugang zur Extension einer Klasse hat. Wenn der Programmierer beispielsweise direkt auf die Extension der Klasse Combatant der Spielgegner zugreifen kann, kann er diesen bei Spielende die Nachricht zukommen lassen, dass sie sich alle auflösen oder sonstwie die Bühne verlassen.

Der direkte Zugriff auf die Extension einer Klasse s kann auf mehrere Arten relativ einfach realisiert werden:

  • Mittels Klassenmethoden (siehe nachfolgendes Beispiel).
  • Mittels einer Singleton-Klasse (z.B. Extension), die den Zugriff auf Klassenextensionen über eine Methode extension(p_class: Class): Dictionary ermöglicht.
  • Mittels einer eigenen Singleton-Klasse für jede Klasse, auf deren Extension man zugreifen möchte (z.B. CombatantExtension oder auch Extension<Combatant>).

Beispiel

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>; dies wird aber von Actionscript 3 nicht unterstützt
    
  public static function get extension(): Dictionary
  {
    return sv_extension;
  }
    
  public function Combatant(...)
  {
    sv_extension[this] = this;
    ...
  }
}

Man beachte, dass extension nicht als Array, sondern als Dictionary realisert wurde, damit das Löschen von Elementen aus der Extension besonders effizient implementiert werden kann. Diese Löschen kann und sollte in Sprachen wie C++ von Destruktor übernommen werden. In Sprachen mit Garbage Collector (wie ActionScript oder Java) müssen dagegen eigene Delete-Operationen implementiert werden.

Vorzugsweise sollte eine Objektmethode delete definiert werden, die jeweils 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 werden, damit der Garbage Collector das Objekt auch wirklich löschen kann.

Subklassen

Laut Definition ist die Extension einer Subklasse B Teilmenge der Extension der zugehörigen Superklasse A. Insbesondere besteht die Extension einer Abstrakten Klasse oder eines Interfaces aus der Vereinigung der Extensionen aller nicht-abstrakten Subklassen, d.h. aller Subklassen, die eine eigenene Extension haben.

Die Implementierung der Extensionsverwaltung einer Klassenhierarchie ist nicht wesentlich aufwendiger, als die Implementierung der Extensionsverwaltung einer einzelnen Klasse. Falls man die Extension eines Interfaces benötigt, kann man die oben vorgestellte Extensionverwaltung auf Basis von Klassenmethoden nicht verwenden, da Interfaces in der Regel keine statischen Methoden unterstützen. Hier muss man eine der anderen zuvor genannten Alternativen wählen.

Quellen

  1. Kowarschick (MMProg): Wolfgang Kowarschick; Vorlesung „Multimedia-Programmierung“; Hochschule: Hochschule Augsburg; Adresse: Augsburg; Web-Link; 2018; Quellengüte: 3 (Vorlesung)
  1. Kowarschick (2002a): Wolfgang Kowarschick; Multimedia-Programmierung – Objektorientierte Grundlagen; Hrsg.: Michael Lutz und Christian Märtin; Reihe: Informatik interaktiv; Verlag: Fachbuchverlag Leipzig im Carl Hanser Verlag; ISBN: 3446217002; 2002; Quellengüte: 5 (Buch)