Announcement

Collapse
No announcement yet.

Polymorphie geht nicht

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

  • #16
    Danke für eure Hilfe, jetzt ist mir einiges klarer.
    Werde das Speichern dann erstmal von Hand coden. Und mal versuchen 'nen vernünftigen Workflow mit allen mir bekannten (nun auch Interfaces) OOP Möglichkeiten zu erarbeiten

    Comment


    • #17
      Habe wieder ein Problem:

      Ich habe jetzt also ne Klasse Katze, Tier und Hund, wobei Katze und Hund von Tier erben.

      <PRE>
      var
      Tier:TTier;
      begin
      Tier:=TKatze.Create; //funktioniert
      end;

      </PRE>

      Jetzt wollte ich eine Klasse Tieransammlung kreieren und dabei auf ObjectLists verzichten (Delphi 4).

      <PRE>
      TTierAnsammlung=class
      private
      FTiere:Array of TTier;
      function GetTier(ind:Integer):TTier;
      procedure SetTier(ind:Integer;tier_:TTier);
      public
      property Tiere[ind:Integer]:TTier read GetTier write SetTier;
      end;

      implementation

      function TTieransammlung.GetTier(ind:Integer);
      begin
      if Length(FTiere)>ind then
      Result:=FTier[ind]
      else
      begin
      Result:=nil;
      end;
      end;

      procedure TTieransammlung.SetTier(ind:Integer;tier_:TTier);
      begin
      if ind<Length(FTiere) then
      begin
      SetLength(FTiere,ind+1);
      FTiere[ind]:=TTier.Create;
      end;
      end;
      </PRE>

      Jetzt funktioniert folgendes nicht:

      <PRE>
      var
      tieransammlung:TTieransammlung;
      begin
      tieransammlung.Tiere[0]:=TKatze.Create; //bis hierhin sagt er nix

      ShowMessage(tieransammlung.Tiere[0].Classname);
      {gibt TTieransammlung aus, hier sollte doch aber TKatze ausgegeben werden?!? Demzufolge komme ich auch nicht an die Eigenschaften von TKatze ran}

      //Selbst:

      (Tieransammlung.Tier[0] as TKatze).beine:=5;

      //liefert mit einen Invalid Class Typecast

      end;
      </PRE>

      Vielleicht wißt ihr ja, was ich hier falsch mache.

      Danke euch schonmal

      Comment


      • #18
        Hallo!<br>
        Sorry ohne es jetzt explizit nachgesehen (compiliert) zu haben kommt mir<br>
        procedure TTieransammlung.SetTier(ind:Integer;tier_:TTier); <br>
        begin <br>
        if ind<Length(FTiere) then <br>
        begin <br>
        SetLength(FTiere,ind+1); <br>
        FTiere[ind]:=TTier.Create; <br>
        end; <br>
        end; <br>
        dann doch etwas seltsam vor. <br>
        Du erzeugst eine neue Instanz von TTier statt den Parameter Tier_ zu verwenden oder?!?<br>
        BYE BERN

        Comment


        • #19
          Hallo,
          Benrd hat recht, wegen "FTiere[ind]:=TTier.Create;" bekommst du den Typ TTier, das muss tier_ heissen und:
          <pre>
          tieransammlung:= TTieransammlung.create; // !!!
          tieransammlung.Tiere[0]:=TKatze.Create; //bis hierhin sagt er nix
          ShowMessage(tieransammlung.Tiere[0].Classname);
          if (tieransammlung.Tiere[0] is TKatze) then (tieransammlung.Tiere[0] as TKatze).laufen;
          </pre>
          außerdem:
          <pre>
          procedure TTieransammlung.SetTier(ind:Integer;tier_:TTier);
          begin
          if ind>=Length(FTiere) then
          begin
          SetLength(FTiere,ind+1);
          FTiere[ind]:=tier_;
          end;
          end;
          </pre>
          Als erstes muß überhaupt eine instanz von TTieransammlung erzeugt werden und bei der Prozedur setTier muss die Abfrage >= sein, das Array muss nur vergrößerrt werden, wenn der Index außerhalb der Länge des Arrays liegt und zu beginn, wo Array mit der Länge 0 initialisiert ist und du auf das 0 element zugreift, also >=.

          Gruß Ale

          Comment


          • #20
            Ja, ihr habt recht, habe jetzt tier_ erzeugt und dann FTiere zugewiesen.
            So funktionierts.

            Sorry, wegen der späten Antwort.

            Danke für alles

            Comment

            Working...
            X