Autor Thema: Syntax für Sub New bei abgeleiteter Klasse?  (Gelesen 4570 mal)

Offline PeterD2

  • Junior Mitglied
  • **
  • Beiträge: 83
  • Ich liebe dieses Forum!
Syntax für Sub New bei abgeleiteter Klasse?
« 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
« Letzte Änderung: 16.11.07 - 15:02:00 von PeterD2 »

Offline ZaLudtske

  • Senior Mitglied
  • ****
  • Beiträge: 319
  • Geschlecht: Männlich
  • carpe diem
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #1 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
Rainer Zaske

MCSD - C#

Offline PeterD2

  • Junior Mitglied
  • **
  • Beiträge: 83
  • Ich liebe dieses Forum!
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #2 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"

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #3 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

Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline PeterD2

  • Junior Mitglied
  • **
  • Beiträge: 83
  • Ich liebe dieses Forum!
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #4 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.???

« Letzte Änderung: 16.11.07 - 15:20:52 von PeterD2 »

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #5 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

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #6 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...

Offline koehlerbv

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 20.460
  • Geschlecht: Männlich
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #7 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

Offline MadMetzger

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.052
  • Geschlecht: Männlich
  • f.k.a. Alexis Pyromanis
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #8 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.

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #9 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.

« Letzte Änderung: 16.11.07 - 19:36:43 von Axel Janssen »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline Axel

  • Moderator
  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 8.658
  • Geschlecht: Männlich
  • It's not a bug, it's Notes
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #10 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
Ohne Computer wären wir noch lange nicht hinterm Mond!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Syntax für Sub New bei abgeleiteter Klasse?
« Antwort #11 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.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz