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