Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Klassen-Funktionen erweitern und Weitervererben (https://www.delphipraxis.net/116485-klassen-funktionen-erweitern-und-weitervererben.html)

Sereby 30. Jun 2008 13:26


Klassen-Funktionen erweitern und Weitervererben
 
Hallo,

also ich habe eine eigene neue Unit mit ein paar erweiterungen für z.B. die TStrings Klasse
Delphi-Quellcode:
TStrings = class(Classes.TStrings)
public
  function IndexOf2(AKey: String): Integer;
  function GetLineByPos(const MyPosition: Integer): Integer;
  procedure GetSimilarLines(const ALikeKey: String; var AddToList: TStringList);
  function DelLine(const AKey: String): Boolean;
  function LineExist(const AKey: String): Boolean;
end;
So das funktioneirt auch so weit.
Vorher hatte ich das übrigens folgendermaßen geregelt (Delphi 2007)
Delphi-Quellcode:
TStringsHelper = class helper for TStrings
Aber da ich gehört hab dass das vllt in der nächsten Delphi Version nicht mehr vorhanden ist und da ich das gerne Delphi 5(,6 oder 7) Kompatiblel hätte, wollte ich es gleich richtig machen :-)

Naja ich möchte jedenfalls, dass die selben funktionen auch bei TStringList, welche ja von TStrings abgeleitet ist, vorhanden sind. Allerdings ohne diese neu zu definieren wie oben also sodass ich den code nicht doppelt schreiben muss.

wenn ich z.B.
Delphi-Quellcode:
TStringList = class of TStrings;
unterhalb der oben dargestellten klasse schreibe dann wirft er mir folgendes an den Kopf:
Zitat:

[Pascal Fehler] ClassHelpers.pas(157): E2037 Deklaration von 'GetSimilarLines' unterscheidet sich von vorheriger Deklaration
Ich hoffe ihr könnt mir da weiterhelfen :-)

mkinzler 30. Jun 2008 13:30

Re: Klassen-Funktionen erweitern und Weitervererben
 
TStringList ist ja ein Nachfahre von TStrings.

wenn du eine eigen Ableitung willst

TMyStringList = class (TStrings)

Zitat:

Aber da ich gehört hab dass das vllt in der nächsten Delphi Version nicht mehr vorhanden ist
Wo hast du das gehört?

Apollonius 30. Jun 2008 13:35

Re: Klassen-Funktionen erweitern und Weitervererben
 
Wenn du alle TStrings-Nachfahren erweitern willst, musst du Class Helper verwenden. Andernfalls müsstest du von jeder Klasse einzeln ableiten, was weder praktikabel noch immer möglich ist.

Sereby 30. Jun 2008 13:39

Re: Klassen-Funktionen erweitern und Weitervererben
 
Ist mir durchaus bewusst, dass das ein nachfahre ist.. allerdings dachte ich ich könnte das originale TStringList so "überschreiben" wie ich es mit TStrings getan habe nur ohne den gleichen Code nochmal schreiben zu müssen. Geht das? weil ich wollte vermeiden überall wo ich TStringList verwendet habe jetzt TStringList2 oder ähnliches zu verwenden!

Und das hat mir mein Arbeitskollege hier gesagt ^_^ Ich weiss nicht woher er diese Info hat aber er meinte dass das nur ne Übergangslösung gewesen sei zu der zeit als Delphi 2006 gekommen ist.

was ist denn eigentlich besser? TStrings = class(Classes.TStrings) oder class helper?
Also bei Classhelper weiss ich dass es funktioniert, allerdings ist es nicht mit Delphi 5 oder ähnlichem kompatibel. Gibts da irgendwelche vor- bzw nachteile?

Apollonius 30. Jun 2008 13:45

Re: Klassen-Funktionen erweitern und Weitervererben
 
Class Helper sollte man vermeiden, wenn es um eigenen Code geht. An dieser Stelle musst du dich aber in eine fremde Klassenhierarchie einklinken, und dafür sind Class Helper die einzige Lösung. Du könntest zwar in eigenem Code immer eine eigene TStringList-Klasse verwenden, aber die VCL und Fremdcode werden natürlich weiterhin die alte Version verwenden, was nicht der Sinn der Sache war.

Class Helper können in einer neuen Delphi-Version nicht einfach abgeschafft werden. Das würde die Abwärtskompatibilität zerstören, und es gibt auch keinen vernünftigen Grund dafür. Ursprünglich stammen Class Helper aus .NET, aber wie einige andere Dinge gibt es sie nun auch für Win32.

mkinzler 30. Jun 2008 13:45

Re: Klassen-Funktionen erweitern und Weitervererben
 
Class Helper haben den Vorteil, das man mit ihnen zur Laufzeit Klassen erweitern kann. Man kann so auch finale/sealed Klassen erweitern, welche man nicht mehr ableiten kann.
Class Helpers sind aber nicht so flexibel. Man kann z.B. nur neue Eigenschaften/Methoden hinzufügen, keine überdecken oder überladen. Ausserdem muss ja in jeder Unit die entsprechende Unit eingebunden werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:32 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