Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: PeterD2 am 16.11.07 - 14:58:53

Titel: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: PeterD2 am 16.11.07 - 14:58:53
Sorry, ich kann in der Hilfe nirgends ein Beispiel finden wie ich mir ein Objekt von einer abgeleiteten Klasse erzeuge, wenn die Paramter der abgeleiteten Klasse von denen der Basisklasse abweichen.

Beispiel:

class basisklasse
   public sub new(doc as NotesDocument, i as integer)
    ....
   end sub

end class

 'erweiterte Klasse benötigt einen Parameter mehr im Konstruktor

class erweiterteKlasse as basisklasse
   public sub new (strTest as String), basisklasse(doc, i)  '//richtig so?
   ...
  end sub
end class


......
irgendwo im Code:

Dim objekt as erweiterteKlasse

Set objekt=????

Genau! Wie geht das jetzt weiter? Wie muss ich objekt initialisieren um sowohl die Variable "strTest" im Konstruktor der abgeleiteten Klasse zu setzen, als auch doc und i der basisklasse und dabei deren Konstruktor auszuführen?


Ach ja: Die Hilfe sagt zu Sub New():

Sub New [ ( [ argList ] ) ] [ , baseClass ( [ baseArgList ] ) ]

Danke im Voraus

Peter
Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: ZaLudtske am 16.11.07 - 15:02:42
Hallo,

soweit ich mich erinnere ist es leider nicht möglich abgeleitete Klassen mit untschiedlichen Paramamtern als die Basisklasse zu erstellen. Ich denke man kann die Parameter erweitern, aber nicht einschränken.

Rainer
Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: PeterD2 am 16.11.07 - 15:03:48
Es geht ja auch um das Erweitern. In meinem Beispiel sollen beide Klassen die Parameter "doc" und "i" benötigen, aber nur die abgeleitete Klasse zusätzlich "strTest"
Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: Axel am 16.11.07 - 15:06:00
   public sub new (strTest as String), basisklasse(doc, i)  '//richtig so?

Nein!

Muss so aussehen:  public sub new(strTest as String, doc as NotesDocument, i as integer)


So geht's weiter:

Dim objekt as erweiterteKlasse

Set objekt=New erweiterteKlasse(StrTest, doc, i)

Wenn du denn Kontruktor in der erweiterten Klasse überschreibst, wird der von der Basisklasse nicht mehr ausgeführt.


Axel

Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: PeterD2 am 16.11.07 - 15:16:17
Das funktioniert bei mir nicht. Wenn ich das so eingebe gibt´s einen Compilerfehler:

LibMeineLib: Declarations: 1163: SUB NEW arguments do not match parent´s SUB NEW arguments

Selbstverständlich gebe ich dabei den neuen Parameter als ersten in der Parameterliste der abgeleiteten Klasse an.

Was ich auch nicht verstehe: Wie kann ich denn den Konstruktor der Basisklasse NICHT überschreiben? Wenn ich in der abgeleiteten Klasse keine Sub New()  definiere kann ich keine Objekte davon erzeugen ("SUB NEW is required for erweiterteKlasse"), und wenn ich eine Sub New() definiere überschreibe ich die der Basisklasse.???

Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: koehlerbv am 16.11.07 - 17:44:29
Sorry, ich kann in der Hilfe nirgends ein Beispiel finden wie ich mir ein Objekt von einer abgeleiteten Klasse erzeuge, wenn die Paramter der abgeleiteten Klasse von denen der Basisklasse abweichen.

Das funktioniert auch nicht und ist wohl das grösste Manko von LotusScript. Und dagegen kannst Du gar nichts machen.

Bernhard
Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: MadMetzger am 16.11.07 - 17:56:51
Den Konstruktor kann man aufrufen, indem man folgendes schreibt:

Code
Sub new(someParameters), Oberklasse(Parameter zum weiterreichen)

End Sub

Genau so habe ich es schon mehrfach gemacht. Dachte ursprünglich auch mal, dass das nicht geht...
Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: koehlerbv am 16.11.07 - 18:24:52
Ich sehe das aber eher als "workaround", Markus ... Damit geht "etwas", aber ist es die Lösung?

Benrhard
Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: MadMetzger am 16.11.07 - 18:52:50
Ich sehe das nicht als Workaround, sondern als Lösung, wenn er in einer Unterklasse mehr Parameter im Konstruktor braucht. Anders geht es gar nicht, denn du erweiterst ja im Prinzip durch den neuen Paramater die Signatur von new und rufst dann mit dem Zusatz den Konstruktor der Oberklasse auf.

Selbst in Java ist das nicht anders als in LS. Dort würde man auch erst alle Parameter hinschreiben und dann die für die Oberklasse wichtigen per super()-Aufruf an die Vaterklasse weiterleiten. Beispiel aus Java:
Code
public class A

  public A(int i) {
    //Do something
  }

  //methods etc

}

public class B extends A {

  public B (int i, int j) {
    super(i);
    //Do something
  }

  //methods etc

}

In LS und Java wirst du ja auch vom Compiler gezwungen, einen expliziten Konstruktor zu schreiben, wenn der Konstruktor der Superklasse Paramter erwartet. Zudem muss der super-Aufruf im Konstruktor immer als erstes erfolgen. Damit finde ich sogar fast die Lösung von LS eleganter, denn dort kann man den Aufruf des Konstruktors der Oberklasse nur weglassen aber nicht an die falsche Stelle schreiben, da man ja schon von der Grammatik her dazu gezwungen wird.

Zudem hat überschreiben nichts mit den Parametern einer Operation zu tun, sondern das ist ein überladen einer Operation.
Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: flaite am 16.11.07 - 19:28:24
Wenn du denn Kontruktor in der erweiterten Klasse überschreibst, wird der von der Basisklasse nicht mehr ausgeführt.
Nein. In jeder mir bekannten OO Sprache mit Vererbung werden grundsätzlich die Konstruktoren der Klassen von denen geerbt wird beim Aufruf eines Konstruktors der erbenden Klasse aufgerufen. Das macht auch Sinn, weil ein Objekt der erbenden Klasse in einer isA-Beziehung zur Klasse von der die erbende Klasse erbt steht.  ;D

Und das ist ein grundlegender Unterschied im Verhalten von Konstruktoren im Gegensatz normalen Methoden.

Ich seh die Implementierung in LotusScript hier auch nicht als Workaround, sondern als konsistent zu grundlegenden OO-Prinzipien. 

Beispiel:
Die Klasse Hund erbt von Säugetier

Jedes Säugetier (also auch Hund) hat ein property blutTemperatur.
Das property blutTemperatur soll während der ganzen Lebenszeit des Objektes einen sinnvollen Wert haben.
Also legt der Entwickler fest, dass es im Konstruktor von Säugetier gesetzt wird. 

In Java Syntax
Code
       
class Säugetier {
   private double  blutTemp; 
   
   // Konstruktor
   public Säugetier(int blutTemp) {
      this.blutTemp = blutTemp;  
   }

   public double  getBlutTemp() {
      return blutTemp;
   }
}

class Hund extends Säugetier {
    private int bellenLautstärke; 

    public Hund(double blutTemp, bellenLautstärke) {
      super(blutTemp); 
      this.bellenLautstärke = bellenLautstärke; 
   }

   public getBellenLautstärke() {
       return bellenLautstärke; 
   }
}

In konstruktoren werden bestimmte properties gesetzt, die zum state des Objektes gehören.
Der Hund ist ein Säugetier. Also muß hier konkret auch der Wert blutTemp gesetzt sein.
Ein konsistenter state wird am einfachsten dadurch gewährleistet, dass Konstruktoren der Klassen der gesamten Vererbungshierarchie aufgerufen werden und so ist das auch in der Praxis. 

Ohne den super(blutTemperatur) im Hund-Konstruktor würde das in Java nicht kompilieren und zwar mit einer ähnlichen Fehlermeldung wie LotusScript. Manchmal ist kein super()-Aufruf da. Dann wird vom Java-Kompiler automatisch das statement super() eingesetzt, ohne dass man das sieht. Es bedeutet, dass ein Konstruktor ohne Parameter der Klassen von der geerbt wird aufgerufen wird. Der ist aber in Säugetier nicht vorhanden.
Manche Klassen haben überhaupt keinen sichtbaren Konstruktor. Da fügt der KOmpiler dann aber einen impliziten leeren Konstruktor ohne Argumente ein. Sobald eine Klasse irgendeinen Konstruktor hat, muss dieser parameterlose Konstruktor explizit im Code vorhanden sein.

Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: Axel am 17.11.07 - 13:46:15
Wenn du denn Kontruktor in der erweiterten Klasse überschreibst, wird der von der Basisklasse nicht mehr ausgeführt.
Nein. In jeder mir bekannten OO Sprache mit Vererbung werden grundsätzlich die Konstruktoren der Klassen von denen geerbt wird beim Aufruf eines Konstruktors der erbenden Klasse aufgerufen. Das macht auch Sinn, weil ein Objekt der erbenden Klasse in einer isA-Beziehung zur Klasse von der die erbende Klasse erbt steht.  ;D

Wenn dem so ist, soll mir's recht sein. Nur bei LotusScript glaube ich nicht so recht daran. Da hier die Objektorientierung nur recht halbherzig implementiert ist. Ich werde es bei Gelegenheit mal probieren.

Axel
Titel: Re: Syntax für Sub New bei abgeleiteter Klasse?
Beitrag von: flaite am 18.11.07 - 11:01:30
Axel, es ist so.
Versuchs aus (z.B. das Beispiel von Peter).
Sobald du eine Klasse erweiterst (extends keyword) und der public sub new() Konstruktor Parameter hat, ist es so. Ist der Konstruktor parameterlos, wird er auch automatisch aufgerufen, ohne das Oberklasse zum weiterreichen, von dem MadMetzger gesprochen hat.
Bin da auch schon mit LotusScript drauf gestossen.