OBS/Adminhilfe/Generics: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
| (3 dazwischenliegende Versionen von einem anderen Benutzer werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
{{ZugriffOBS}} | {{ZugriffOBS}} | ||
{{ | {{Hinweis|Bisher werden in XE8 nur generische Klassen, aber noch keine generischen Methoden und Prozeduren untestützt.}} | ||
=Übersicht= | =Übersicht= | ||
Generics in Delphi sind abstrakte Klassen, auch parameterabhängige Klassen, die für mehrere Datentypen gültige Funktionen vereinen.<br/> | Generics in Delphi sind abstrakte Klassen, auch parameterabhängige Klassen, die für mehrere Datentypen gültige Funktionen vereinen.<br/> | ||
Zuerst wird die generische Klasse mit einem Parameter anstatt des des Datentypen definiert.<br/> | Zuerst wird die generische Klasse mit einem Parameter anstatt des des Datentypen definiert.<br/> | ||
Bei der Erstellung von Objektinstanzen aus der generischen Klasse wir diesen Objekten zur Entwurfszeit ein Datentyp zugeordnet, der an die Stelle des Parameters tritt. | Bei der Erstellung von Objektinstanzen aus der generischen Klasse wir diesen Objekten zur Entwurfszeit ein Datentyp zugeordnet, der an die Stelle des Parameters tritt. | ||
=Anwendungsmöglichkeiten= | |||
Anwendungsmöglichkeiten beinhalten die Nutzung als Dictionary, Liste, . | |||
=Definieren von generischen Klassen= | =Definieren von generischen Klassen= | ||
Generische Klassen werden in Delphi wie folgt definiert: | Generische Klassen werden in Delphi wie folgt definiert: | ||
| Zeile 17: | Zeile 19: | ||
''OBJEKTNAME'' '''= specialize''' ''KLASSENNAME'' '''<''' ''DATENTYP'' '''>;''' | ''OBJEKTNAME'' '''= specialize''' ''KLASSENNAME'' '''<''' ''DATENTYP'' '''>;''' | ||
=Beispiele= | =Beispiele= | ||
Als Standardbeispiel gilt eine Objektliste aus unbekannten Klassen. <br/> | Als Standardbeispiel gilt eine Objektliste aus unbekannten Klassen, sozusagen ein ''Array von Hand''. <br/> | ||
type | type | ||
generic TList<T> = class | generic TList<T> = class | ||
Items: array of T; | Items: array of T; | ||
procedure Add(Value: T); | procedure Add(Value: T); | ||
function Get(Position: Integer); | |||
end; | end; | ||
| Zeile 30: | Zeile 33: | ||
SetLength(Items, Length(Items) + 1); | SetLength(Items, Length(Items) + 1); | ||
Items[Length(Items) - 1] := Value; | Items[Length(Items) - 1] := Value; | ||
end; | |||
function TList.Get(Position: Integer): T; | |||
begin | |||
result := T[Position]; | |||
end; | end; | ||
| Zeile 37: | Zeile 45: | ||
TPointerList = specialize TList<Pointer>; | TPointerList = specialize TList<Pointer>; | ||
TStringList = specialize TList<string>; | TStringList = specialize TList<string>; | ||
TPointerList.Add(EinPointer); | |||
TPointerList.Get(0); | |||
Damit stehen die in der generischen Klasse definierten Funktionen Add und Get für alle Datentypen zur Verfügung. | |||
=Vorteile und Probleme= | =Vorteile und Probleme= | ||
Generics bieten einige Vorteile, aber auch einige mögliche Probleme, die vermieden werden müssen.<br/> | Generics bieten einige Vorteile, aber auch einige mögliche Probleme, die vermieden werden müssen.<br/> | ||
'''Vorteile:''' | '''Vorteile:''' | ||
*Codeeinsparen durch | *Codeeinsparen durch Wiederverwendbarkeit | ||
*Bessere Übersichtlichkeit und Wartbarkeit des Codes | *Bessere Übersichtlichkeit und Wartbarkeit des Codes | ||
'''Risiken:''' | '''Risiken:''' | ||
*Wenn in den Prozeduren Funktionen genutzt werden, die Datentypspezifisch sind, muss eine Abfrage mittels ''ClassType, ClassParent''' oder ''InheritsFrom'' erfolgen. | *Wenn in den Prozeduren Funktionen genutzt werden, die Datentypspezifisch sind, muss eine Abfrage mittels ''ClassType, ClassParent''' oder ''InheritsFrom'' erfolgen. | ||
Aktuelle Version vom 18. August 2016, 07:19 Uhr
Dies ist eine zugriffsgeschützte Seite.
- System Überwachung
- DEP deaktivieren
- Darstellung unter Windows 7
- Einwahl auf Windows 2000 Server
- Preislisten
- Datenbank Sicherung
- Customize
- Zentrale
- Support Macro
- Service Debug
- Historienprotokoll (Datenänderung OBS)
- Fernwartungsprobleme
- Startparameter
- Fehler beim Kassenabschluss
- Diverse Informationen
- A ras.pbk
- B Command Line Interpreter
- C File Zilla Benutzer XML erzeugen
- D1 OBS_UPDATE.EXE zum OBS Update Server hochladen
- D2 SUPPORT_MACRO zum OBS Update Server hochladen
- H1 Remote Service Protokoll-Übersicht (Alles)
- H Remote ServiceProtokoll-Übersicht
- I Remote Service Commands
- I1 (Admin) Globaler Hinweis für Updates
- J Liste der OBS Updates
- K Angemeldete Service Firmen
- L Systeminformationen einlesen
- M Kundendaten anzeigen
- M1 Kundendatenbankinformationen anzeigen
- N Kundendaten einlesen
- O Kunden-Update Informationen anzeigen
- P Modul Registrierung OBS
- Q App Verwaltung
- S1 Firmen Statistik Protokolle OBS
- S2 Statistik Notfallkassen
Übersicht
Generics in Delphi sind abstrakte Klassen, auch parameterabhängige Klassen, die für mehrere Datentypen gültige Funktionen vereinen.
Zuerst wird die generische Klasse mit einem Parameter anstatt des des Datentypen definiert.
Bei der Erstellung von Objektinstanzen aus der generischen Klasse wir diesen Objekten zur Entwurfszeit ein Datentyp zugeordnet, der an die Stelle des Parameters tritt.
Anwendungsmöglichkeiten
Anwendungsmöglichkeiten beinhalten die Nutzung als Dictionary, Liste, .
Definieren von generischen Klassen
Generische Klassen werden in Delphi wie folgt definiert:
type
generic KLASSENNAME < PARAMETER > = class
ATTRIBUTE
FUNKTIONEN/METHODEN/PROZEDUREN
end;
Erzeugen von Objektinstanzen der generischen Klasse
Beim Erzeugen eines neuen Objektes der generischen Klasse wird diesem zur Entwurfszeit ein Datentyp zugeordnet.
type OBJEKTNAME = specialize KLASSENNAME < DATENTYP >;
Beispiele
Als Standardbeispiel gilt eine Objektliste aus unbekannten Klassen, sozusagen ein Array von Hand.
type
generic TList<T> = class
Items: array of T;
procedure Add(Value: T);
function Get(Position: Integer);
end;
implementation
procedure TList.Add(Value: T);
begin
SetLength(Items, Length(Items) + 1);
Items[Length(Items) - 1] := Value;
end;
function TList.Get(Position: Integer): T;
begin
result := T[Position];
end;
Diese Klasse kann dann als Listenobjekt eines bestimmten Datentypen wiederaufgerufen werden, muss dazu dann spezialisiert werden:
Type TIntegerList = specialize TList<Integer>; TPointerList = specialize TList<Pointer>; TStringList = specialize TList<string>; TPointerList.Add(EinPointer); TPointerList.Get(0);
Damit stehen die in der generischen Klasse definierten Funktionen Add und Get für alle Datentypen zur Verfügung.
Vorteile und Probleme
Generics bieten einige Vorteile, aber auch einige mögliche Probleme, die vermieden werden müssen.
Vorteile:
- Codeeinsparen durch Wiederverwendbarkeit
- Bessere Übersichtlichkeit und Wartbarkeit des Codes
Risiken:
- Wenn in den Prozeduren Funktionen genutzt werden, die Datentypspezifisch sind, muss eine Abfrage mittels ClassType, ClassParent' oder InheritsFrom erfolgen.