Domino 9 und frühere Versionen > Entwicklung
Wie kann ich eine Klasse sinnvoll aufbauen ?
animate:
--- Zitat von: TMC am 02.07.04 - 20:54:05 ---Was ich noch nicht ganz kapiere ist der Zusammenhang Field-Objekt mit FieldText-Objekt.
Wie ich das sehe:
Das Field-Objekt ist ein Auto.
Das FieldText-Objekt ist der Reifen vorne Links.
--- Ende Zitat ---
falsch.
das ist Vererbung.
Field ist ein Auto.
FieldText ist ein Sportwagen.
FieldRTF ist ein Kombi.
FieldNumbers ist ein Jeep.
Alle sind Autos und alle haben was gemeinsam. Aber bei speziellen Dingen unterscheiden sie sich.
Bei unseren Feldern wäre z.B. eine Gemeinsamkeit, dass alle eine Wert vor und einem nach dem Speichern haben können.
Das Spezielle ist, dass jede Feld-Art den Unterschied zwischen Vor- und Nachher anders "berechnet".
--- Zitat ---Was ich gesehen habe wird das Auto kursiv in den UML-Diagrammen dargestellt. Ich glaub ich kann dann auch das Auto-Objekt nicht direkt erzeugen. Ich fange beim Reifen an.
Wie sind denn hier die Zusammenhänge? Und: Warum ist das Auto "kursiv"? Warum mache ich nicht ein normales Auto-Objekt, welches dann auch Objekte wie Reifen vorne links und Fahrersitz enthält?
--- Ende Zitat ---
Auto ist kursiv, weil es das nicht wirklich gibt. Es gibt nur Jeeps, Cabrios, Kombis, Limousinen, etc.
Auto ist der Oberbegriff für alle.
Feld ist kursiv, weil es kein allgemeines Feld bei uns gibt (wir erinnern uns: kursiv bedeutet abstrakte Klasse, d.h. von dieser Klasse kann keine Instanz erzeugt werden, weil es die ja gar nicht geben kann.)
Ein schönes Beispiel aus "Head First Java" (frei übersetzt):
Es gibt eine Klasse "Tier"
Von dieser erben die Klassen "Canidae" und "Felidae".
Von "Canidae" erbt "Hund", "Wolf"
Von "Felidae" erbt "Katze", "Löwe"
Es macht Sinn, Objekte der Klasse "Hund", "Wolf", "Katze" und "Löwe" zu erstellen.
Aber was genau ist ein "Tier"-Objekt??
Welche Form hat es? Welche Frabe, Größe, Anzahl an Beinen...
Wenn du versuchst, ein "Tier"-Objekt zu erstellen, dann ist das wie ein verheerender Transporterunfall in StarTrek. So einer, wo bei Beam-Vorgang irgenwas schlimmes mit dem Puffer (der, in dem die Transportmuster sind) passiert.
Du brauchst aber trotzdem eine Klasse, die Gemeinsamkeiten vererben kann. Um zu vermeiden, dass Objekte einer Klasse erstellt werden, für die das keinen Sinn macht, machst du die Klasse abstrakt.
Zumindest in Java. In LotusScript gibt es keine abstrakten Klassen, ich tue aber so, als ob.
TMC:
Danke Thomas, nun wird für mich vieles klarer :-)
Sehr gute Erkärung.
Na ja, nächste Frage kommt bestimmt noch, aber das ist ja u.a. auch Sinn und Zweck dieses Threads ;)
TMC:
Neue (allgemeine) Frage:
Wann nehme ich "sub new(irgendwas as ...)" und wann "Public Property Set", um meinem Objekt Eigenschaften zu geben?
OK, sub new() geht ja nur, wenn ich das Objekt erzeuge.
Warum ich frage:
Es könnte ja sein, dass ich in der Klasse eine Function habe, die braucht aber unbedingt eine Variable. Soll man da dann die Variable gleich zu Beginn der Objekterzeugung geben lassen (eben über sub new) Aber vielleicht kenne ich die am Anfang noch gar nicht?
Denn wenn die Property nicht gesetzt ist (Public Property Set...), dann erhalte ich einen Fehler, weil ja die Function eine Variable braucht.
Ich hoffe meine Frage ist einigermaßen verständlich.... ::)
TMC:
Noch ne Frage zu abstrakten Klassen:
So wie ich das jetzt kapiere, versucht man wohl, so viel wie es Sinn macht in eine übergeordnete, abstrakte Klasse zu packen - und nur die Unterschiede dann in die darunterliegenden Klassen. Um auch u.U. später neue darunterliegende Klassen erzeugen zu können.
Wie ich oben in einem Code gesehen habe, ruft man die Abstrakte Klasse via
"Public Class UNTERKLASSE As ABSTRAKTEKLASSE" auf.
Ich habe damit auch Zugriff auf private Membervariablen der "ABSTRAKTEKLASSE".
Was kann ich noch alles auslagern in eine abstrakte Klasse? Functions/Subs wohl bestimmt.
Get/Set-Methoden gehen wohl nicht, wenn ich von da aus eine Function einer Unterklasse aufrufen will. Denn die abstrakte Klasse lässt sich dann nicht kompilieren.....
Semeaphoros:
Zuerst mal zur ersten Frage, tatsächlich macht es Sinn, möglichst früh irgendwleche Member-Variablen zu besetzen, vor allem, wenn sie später unbedingt gebraucht werden, also wenn immer möglich werden die schon mit New initialisiert, wenn das nicht geht, dann muss man eben über eine setter-methode arbeiten. Man kann das aber auch kombinieren, indem eine Setter-Methode definiert und bei New überprüft, ob der Parameter gültig ist, wenn ja, wird von New aus die Setter-Methode aufgerufen.
Zu den abstrakten Klassen (wobei das in diesem Falle irrelevant ist, ob die Oberklasse abstrakt ist oder "konkret", abstrakt besagt ja nur, dass man diese Klasse selbst nicht instanziieren kann (oder im Falle von LS sollte) und hat sonst nix zu bedeuten).
Du kannst alles in die Basisklasse hinüberbringen, was Sinn macht, inklusive Setter- und Getter Methoden. Die werden alle schön brav mitvererbt. Vielleicht studierst Du mal die Vererbung in der Hilfe und die für LS besondere Schreibweise, wenn eine an sich überschriebene Methode der Basisklasse aufgerufen werden soll, da gibts dann die besondere DotDot-Notation:
Basisklase..MethodeDerBasisklasse
Für Fortgeschrittene zum Nachschlagen: Early binding und Late Binding spielt hier auch eine Rolle (und dann sind wir schon bald einmal bei abstrakten Methoden). Um, das ist schon eine geballte Ladung, aber gibt vielleicht eine Idee davon, dass wir es hier mit einer ziemlich komplexen Vererbungsstruktur zu tun haben.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln