Announcement

Collapse
No announcement yet.

Object zur Laufzeit / knifflig

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Object zur Laufzeit / knifflig

    Hallo Leute,

    ich habe ein Problem und hoffe ihr könnt mir weiterhelfen.

    Also ich habe in einer Liste ein Objekt leider wird erst zur Laufzeit klar von welchem Typ das Objekt ist.

    Beispiel:

    Zwei Klassen: Auto und Schiff

    Ich erzeuge nun eine Objekt aus EINER dieser Klassen..über Tabellen Namen ClassByName usw. Dieses erstellte Objekt wird in einer Liste<?> gespeichert.

    Jetzt das eigentliche Problem ich möchte jetzt im zweiten Schritt auf die "Values" je nachdem ob es Auto oder Schiff ist zugreifen.

    Ist das Objekt das zur Laufzeit erstellt wird bspw. Auto so möchte ich gerne dieses Objekt nehmen und auf das Feld, die Methode getReifen zugreifen können. Ist es bspw. Schiff möchte ich auf die Methode getHafen zugreifen können.

    Das Objekt wird eben erst zur Laufzeit erstellt. Das ist dann zwar vom Typ Auto oder Schiff aber mir ist es ja nicht möglich direkt auf die Methodenzugreifen zu können ---vor der Laufzeit.

    Nicht in Frage kommt eine Abprüfung mit if Object instance of Auto oder so.
    Es soll alles komplett dynamisch sein.

    Was brauche ich dafür gibt es evt. möglich herangehensweisen, welche APIs sind nützlich?
    Vielen Dank für jeden Tipp

  • #2
    Du kann die Methodennamen der Klasse auslesen und eine deiner Wahl aufrufen. Aber irgendwann wirdst du mal ein IF einbauen müssen...spätestens bei der Auswahl der Methode
    Christian

    Comment


    • #3
      Woher soll denn das Programm dann wissen welche Funktion es aufzurufen hat? Ich würde ein Interface definieren was alle Deine Autos und Schiffe gemeinsam haben. Dieses Interface implementierst Du in allen Klassen die es benötigen, auch wenn Sie die Funktionsaufrufe einfach nur weiterdeligieren.

      Etwa so:

      [highlight=c#]
      interface IGefaehrt
      {
      void Bewegen();
      }

      class Auto: IGefaehrt
      {
      private Fahre()
      {
      //fahr ein paar meter
      }
      void Bewegen()
      {
      Fahre();
      }
      }

      class Schiff: IGefaehrt
      {
      private Schwimme()
      {
      //schwimm ein paar meter
      }

      void Bewegen()
      {
      Schwimme();
      }
      }[/highlight]

      Verwenden kannst du das dann so:

      [highlight=c#]
      ...
      List<IGefaehrt> list = new List<IGefaehrt>();
      list.add(new Auto());
      list.add(new Schiff());

      foreach(IGefaehrt gefaehrt in list)
      gefaehrt.Bewegen();
      [/highlight]

      Die Syntax ist zwar jetzt c# aber so ähnlich sollte das in Java wohl auch gehen

      Wenn Du die Objekte von wo anders her bekommst, dann kannst Du noch einen Adapter dazwischen bauen, der muss allerdings auch für jeden Objekttyp den Du bekommen kannst definiert werden.

      Ansonsten kann ich mir gar nicht vorstellen wie das funktionieren soll. Es MUSS eine einheitliche Schnittstelle geben... Du kannst ja nicht an der gleichen Stelle im Quellcode sagen: Auto.Tanken() oder Schiff.Hupen(). Macht nicht viel Sinn
      Zuletzt editiert von fanderlf; 19.08.2009, 14:28.

      Comment


      • #4
        kannst ja nicht an der gleichen Stelle im Quellcode sagen: Auto.Tanken() oder Schiff.Hupen(). Macht nicht viel Sinn
        Jedenfalls nicht in Jave in C/C++ geht das schon. Das mit dem Interface macht nur Sinn, wenn beide Klassen dieses auch implementieren. Das will er jedoch ausdrücklich nicht???
        Christian

        Comment


        • #5
          Wie geht denn sowas in C/C++? Zumindest die Parameterliste muss doch übereinstimmen.

          Er hatte geschrieben, dass er keine meterlangen if() abfragen will. Das kann man allerdings mit dem Interface (und evtl. Adapter) umgehen.
          Ansonsten würds mich interessieren wie denn der Quellcode aussehen soll, den er haben möchte. Irgendwo muss er den Namen der Funktion definieren die aufgerufen werden soll.

          Comment


          • #6
            Nun per Code- Injection lässt sich bestimmt auch etwas machen.....


            Irgendwie stellt sich mir die Frage, ob
            Nicht in Frage kommt eine Abprüfung mit if Object instance of Auto oder so.
            Es soll alles komplett dynamisch sein.
            das dann etwas über das Ziel hinausgeschossen ist. Nunja eventuell bin ich da ja etwas "Old-School", aber der Auwand der manchmal getrieben wird um etwas "dynamisch" zu halten steht dann in keinem Zusammenhang mit dem Aufwand der für eine Änderunge u.ä. erforderlich wäre.
            Christian

            Comment


            • #7
              Das sehe ich auch so... wenn man da eine einfache Schnittstelle definieren kann auf den Objekten, dann finde ich das sehr übersichtlich.

              Adapater würde ich allerdings auch nur dann verwenden, wenn eine if() Struktur zu unübersichtlich wäre.

              Comment

              Working...
              X