Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   BCB: Problem mit abstrakter Klasse (https://www.delphipraxis.net/62504-bcb-problem-mit-abstrakter-klasse.html)

messie 5. Feb 2006 18:04


BCB: Problem mit abstrakter Klasse
 
Hallo,

ich möchte im BCB zur Laufzeit eine TntComboBox erzeugen und mit Items füttern. Deren Typ ist TTntStrings. Ich versuche dazu, lokal TntStrings zu erzeugen und die später dann an die TntCombobox zu übergeben.
Das Problem: mit dem Konstrukt
Code:
TTntStrings *MyItems;
  MyItems = new TTntStrings;
falle ich auf die Nase, weil TTntString eine abstrakte Klasse ist (bitte nicht fragen ob ich deren Sinn verstanden habe).

Muss ich, wenn ich nach diesem Prinzip vorgehen benutzen will immer den Weg über eine abgeleitete Klasse gehen?

Käme mir etwas merkwürdig vor...

Grüße, Messie

mirage228 5. Feb 2006 18:05

Re: BCB: Problem mit abstrakter Klasse
 
Hi,

ja, ist genauso wie bei TStrings mit Delphi. Verwende TntStringList - falls vorhanden.

mfG
mirage228

messie 5. Feb 2006 18:16

Re: BCB: Problem mit abstrakter Klasse
 
Zitat:

Zitat von mirage228
ja, ist genauso wie bei TStrings mit Delphi. Verwende TntStringList - falls vorhanden.

Nur daß Delphi einem vorgaukelt daß es funktioniert - Compiler meldet "Instanz für virtuelle...erzeugt" und einen dann zur Laufzeit in einen abstrakten Fehler laufen läßt...

Grüße, Messie

Der_Unwissende 5. Feb 2006 18:20

Re: BCB: Problem mit abstrakter Klasse
 
Zitat:

Zitat von messie
Muss ich, wenn ich nach diesem Prinzip vorgehen benutzen will immer den Weg über eine abgeleitete Klasse gehen?

Käme mir etwas merkwürdig vor...

Sorry wenn du jetzt den Eindruck vom Oberlehrer hast oder so, aber abstrakte Klassen werden dir sicherlich häufiger begegnen und sind gar nicht so unwichtig. Deshalb kurz die Erklärung, warum du die nicht direkt instanziieren kannst.

Eine abstrakte Klasse kann Methoden besitzen, die sind abstrakt. Das heißt du hast erstmal eine ganz normale Klasse und für die gilt auch einfach alles, was für eine normale Klasse gilt. Dann kommt aber noch ein wenig dazu, nämlich die abstrakten Methoden. Für diese sagst du nur, wie sie heißen und was für Parameter sie bekommen. Wie sie implementiert werden, dass steht dann noch gar nicht fest, gibt einfach nur die Signatur.
Würdest du jetzt eine Instanz von dieser Klasse erzeugen, würden diese nicht implementierten Methoden natürlich nicht funktionieren. Also geht das erst gar nicht.

Wo ist der Sinn? Abstraktion. Jeder nicht abstrakte Nachfahre hat auf jeden Fall die Methoden mit diesen Signaturen, aber wie genau die implementiert werden, kann dir egal sein. Wenn du zum Beispiel Daten speichern willst, könntest du einen Container schaffen, der alles mögliche aufnimmt, einfach mit einem Add(Element : TElement) oder etwas C-Like add(TElement element).
Ist dies eine abstrakte Methode der Klasse TContainer, könntest du jetzt eine THashList, TLinkedList und ein TArray ableiten, die zwar alle diese Methode implentieren, aber völlig anders jeweils.
Die THashlist, könnte wirklich mit Hashcodes arbeiten, die TLinkedList eine verkettete Liste sein und nun ja, TArray ist auch klar.
In deinem Programm benutzt du einfach nur ein TContainer und egal was du für einen Nachfahren bekommst, es würde funktionieren. Und dich interessiert in der Regel einfach nicht, wie gespeichert wird, hauptsache schnell und es funktioniert.

Gruß Der Unwissende


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