Thommy: kann ich mehr als eine klasse erweitern? EXTENDS

hallo,

ich möchte mein java-programm, das einem bestimmten socket lauscht in eine webseite als java-applet einbinden.

public class CheckServer extends ServerSocket, Applet
(geht nicht)

habt ihr andere ideen, wie ich die klassenerweiterung machen kann?

Danke und Gruss

  1. Hallo,

    Java unterstützt bewußt keine Mehrfachvererbung. In Deinem Fall wäre es wahrscheinlich am besten Checkserver von Applet abzuleiten, und dann der Klasse ein Attribut (eine Variable) vom Typ ServerSocket zu spendieren. Funktionsaufrufe von Serversocket müssen dann halt aus Applet erfolgen, wenn Du wirklich viele Funktionen von ServerSocket von Außen aufrufen willst (was bei Vererbung Applet aber eigentlich garnicht vorkommen dürfte), könntest Du eine Methode: getServerSocket() in CheckServer haben, die eine Referenz auf das Attribut vom Typ Server nach Außen gibt. Hoffe ich hab mich verständlich ausgedrückt.

    Gruß

    Marko

    1. Hoffe ich hab mich verständlich ausgedrückt.

      Naja, eigentlich versteh ich ja nur bahnhof.
      Bin Student und arbeite an einem scm-Projekt, aber das tut mal nix zur Sache ;).
      Ich habe das Programm, das lauscht vor zwei Stunden bekommen, und mein Praxisbetreuer hat gemeint, ich solle mal gucken, ob ich das in einem Java-Applet zum laufen bekomme.

      Dazu muss ich eines sagen:
      Ich hab in Java so gut wie keine Ahnung von den Klassen und so weiter, hab bis jetzt nur versucht, die ganze Sache zu verstehen. In der literatur hab ich auch nichts gefunden, womit ich eben mehrere Klassen erweitern kannst.

      Ich stell jetzt einfach mal den Code rein:

      ----------------------------------------------------------------------

      import java.io.*;
      import java.net.*;

      public class CheckServer extends ServerSocket

      {
       private boolean stop;

      public CheckServer (int port) throws IOException
       {
        super(port);
       }

      public static void main(String[] args) throws IOException
       {
        try
        {
         new CheckServer(Integer.parseInt(args[0])).start();
        }
           catch(IOException e)
           {
            System.out.println("kann port nicht oeffnen");
           }
       }

      public void start()
       {
        stop = false;
        //System.out.println("Nach Accept");

      while (!stop)
         {
          try
          {
           Socket socket = accept();
           System.out.println("Nach Accept");

      BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          String o = input.readLine();
          System.out.println(o);

      System.out.println("Vor Output");

      BufferedWriter output = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

      output.write("Matz du Wuaschd!");
          output.newLine();
          output.flush();
          output.close();
          input.close();
          socket.close();
         }
         catch (IOException e)
         {
         }
        }

      try
        {
         close();
        }
        catch (IOException e)
        {
        }
       }

      public void stop()
       {
        stop = true;
       }

      }

      ----------------------------------------------------------------------

      Bin für jede Antwort Dankbar.

      Gruss

      1. Hallo,

        also wenn ich es recht verstehe, ist Deine Klasse ein Server, das gibt mit einem Applet schonmal das Problem, dass Applets nur Verbindungen mit Ihrem Herkunftsserver aufbauen dürfen. Die Restriktion kann man allerdings in Java2 durchbrechen, aber das führt recht weit, und praktisch gemacht habe ich es auch noch nicht.
        Dann ist ein Applet eine grafische Komponente, also müsstest Du die Ergebnisse irgendwie mit GUI Elementen (z.B. in einem Textfeld) darstellen. Momentan machst Du ja nur Konsolenausgabe (geht zwar auch, macht man aber bei Applets nur für Debug und Fehlermeldungen).
        Zu Deinem grundsätzlichen Ausgangsproblem, nicht Durch Vererbung aus dem Server ein Applet machen, sondern mach erst ein Applet, probier das ruhig mal vorher aus, und baue dann die Serverklasse als Variable im Applet ein. Aber irgendwie muss ich Dir ehrlich sagen, arbeite Dich erstmal noch etwas allgemein in Java ein, momentan hast Du Dir noch etwas viel für den Anfang vorgenommen :-) Nimm ein gutes Buch zur Hand und lerne Java von Grund auf (Klassen, Objektorientierter Programmierstil, Bau von grafischen Oberflächen) bevor Du dich an Netzwerkanwendungen wagst.

        Gruss

        Marko

        1. Hallo nochmal,

          hab nochwas vergessen:

          In der literatur hab ich auch nichts gefunden, womit ich eben mehrere Klassen erweitern kannst.

          Es geht auch definitiv nicht, Du kannst in Java immer nur von einer Klasse erweitern.Das meinte ich mit Mehrfachvererbung gibt es nicht.

          Gruss

          Marko

  2. Hi

    public class CheckServer extends ServerSocket, Applet
    (geht nicht)

    AFAIK gab es am Anfang die Überlegung Klassen von mehreren Klassen ableiten zu können (wie z.B. in C++). Das führt jedoch zu einigen Problemen, z.B. wenn beide Klasse eine Funktion selben Namens mit denselben Parametern haben. Deshalb kann eine Java-Klasse nur eine Elternklasse haben. Es können jedoch mit implements sogenannte Interfaces eingebunden werden. Das ist eine Abart der abstrakten Klassen, d.h. es können nur Felder und Methoden ohne Rumpf definiert werden.
    Eine Klasse muss deshalb Methoden eines eingebunden Interfaces überschreiben. Der Sinn der Sache ist es, dass ganz unterschiedliche Klassen trotzdem gewisse gleiche Eigenschaften haben und so gleich behandelt werden könenn.

    habt ihr andere ideen, wie ich die klassenerweiterung machen kann?

    Die Idee mit den Interfaces macht bei dir so glaube ich keinen Sinn. Vielleicht kann die jemand anderes eine Lösung für dein Problem sagen.

    Schöne Grüße

    Johannes

    --
    Stop bushism
    ss:| zu:) ls:[ fo:) de:] va:) ch:] sh:( n4:& rl:( br:^ js:| ie:{ fl:( mo:|
    Selfcode bei http://emmanuel.dammerer.at/selfcode.html
    1. Hi,

      AFAIK gab es am Anfang die Überlegung Klassen von mehreren Klassen ableiten zu können (wie z.B. in C++). Das führt jedoch zu einigen Problemen, z.B. wenn beide Klasse eine Funktion selben Namens mit denselben Parametern haben.

      Und das ist in Java IMMER der Fall, da ALLE Klassen immer java.lang.Object als oberstes Element der Ableitungshierarchie haben...

      cu,
      Andreas

      --
      Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
      http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
      1. Hi Andreas

        Und das ist in Java IMMER der Fall, da ALLE Klassen immer java.lang.Object als oberstes Element der Ableitungshierarchie haben...

        Das verstehe ich nicht ganz. Wenn ich eine Klasse1 definiere ohne sie von irgendetwas abzuleiten, dann ist die Objekthierarchy ganz einfach java.lang.Object > Klasse1. Wenn ich eine Klasse2 von Klasse1 ableite sieht die Ableitungshierarchie AFAIK so aus: java.lang.Object > Klasse1 > Klasse2. Klasse2 wird also nicht direkt aus Objekt abgeleitet.

        Schöne Grüße

        Johannes (Man möge mich korrigieren)

        --
        Stop bushism
        ss:| zu:) ls:[ fo:) de:] va:) ch:] sh:( n4:& rl:( br:^ js:| ie:{ fl:( mo:|
        Selfcode bei http://emmanuel.dammerer.at/selfcode.html
        1. Hi,

          Hi Andreas

          Und das ist in Java IMMER der Fall, da ALLE Klassen immer java.lang.Object als oberstes Element der Ableitungshierarchie haben...
          Das verstehe ich nicht ganz. Wenn ich eine Klasse1 definiere ohne sie von irgendetwas abzuleiten, dann ist die Objekthierarchy ganz einfach java.lang.Object > Klasse1. Wenn ich eine Klasse2 von Klasse1 ableite sieht die Ableitungshierarchie AFAIK so aus: java.lang.Object > Klasse1 > Klasse2. Klasse2 wird also nicht direkt aus Objekt abgeleitet.

          Hab ich ja auch nicht behauptet, daß alle Klassen direkt von java.lang.Object abgeleitet seien.

          Sondern nur, daß als OBERSTES Element der Ableitungshierarchie immer java.lang.Object steht.

          cu,
          Andreas

          --
          Der Optimist: Das Glas  ist halbvoll.  - Der Pessimist: Das Glas ist halbleer. - Der Ingenieur: Das Glas ist doppelt so groß wie nötig.
          http://mud-guard.de/? http://www.andreas-waechter.de/ http://www.helpers.de/
          1. Hi Andreas

            Hab ich ja auch nicht behauptet, daß alle Klassen direkt von java.lang.Object abgeleitet seien.
            Sondern nur, daß als OBERSTES Element der Ableitungshierarchie immer java.lang.Object steht.

            Da hab ich da wohl was reininterpretiert was nicht stimmte. Tut mir leid.

            Weiterhin schöne Grüße

            Johannes

            --
            Stop bushism
            ss:| zu:) ls:[ fo:) de:] va:) ch:] sh:( n4:& rl:( br:^ js:| ie:{ fl:( mo:|
            Selfcode bei http://emmanuel.dammerer.at/selfcode.html