Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Odpowiednik javy "instanceof" w Delphi

Łuk_F 30 Kwi 2007 12:36 1161 3
  • #1 30 Kwi 2007 12:36
    Łuk_F
    Poziom 16  

    Witam.


    Czy w Delphi jest odpowiednik z javy "instanceof"?

    Jeśli jest coś takiego to jak zadeklarować obiekt aby przechowywał referencje do innych obiektów.

    Z góry dziekuje za zainteresowanie.

    0 3
  • #2 07 Maj 2007 21:46
    mirekk36
    Poziom 42  

    nie wiem jak działa instanceof w javie ale przechowywanie referencji do innych obiektów czy klas to żaden problem. Deklarujesz sobie jakikolwiek obiekt, który zawiera tablicę wskaźników nawet typu Pointer. W najprostszym z możliwych przypadków bierzesz sobie zwykłą i popularną StringList'ę. Można w niej przechowywać zarówno stringi jak i liczby (wielkości słowa dwubajtowego). To właśnie w to miejsce możesz wpisać - zapamiętać wskaźniki do interesujących cię obiektów - najróżniejszych. Następnie gdy chcesz się odwołać przez referencję do dowolnego z nich robisz rzutowanie typów (do klas twoich obiektów) i dzięki temu możesz pośrednio (niejawnie) odwoływać się do bezpośrednich metod i propertiesów tychże zapamiętanych tam obiektów. Może to troszkę zagmatwane tłumaczenie ale bardzo fajnie i przyjemnie się z tego korzysta ;)

    żeby to jakoś uzmysłowić pokażę kawałek kodziku:

    Cytat:
    procedure TForm1.Button1Click(Sender: TObject);
    var
    mList: TStringList;
    begin
    try
    mList := TStringList.Create; //tworzymy stringlistę
    mList.AddObject('ew opis obiektu', TObject (Memo1)); // dodajemy do Stringlisty jedną pozycję tzn jednocześnie string oraz liczbę o której mówiłem (ta liczba to w naszym przypadku wskaźnik na np standardowy obiekt Memo1

    TMemo(mList.Objects[0]).Lines.Add('jakiś tekst'); // i tu najciekawszy punkt programu ;) ... zobacz jak w niejawny sposób odwołuję się przez referencję do jednego z propertiesów naszego Memo1 tzn Lines - fajnie co?
    finally
    FreeAndNil(mList);
    end
    end;


    ... i tak poprzez indeksowanie samej stringlisty możesz mieć dostęp do dowolnego i najróżniejszego obiektu - trzeba tylko zakładając że mają być różne jakoś je rozpoznawać ale wtedy może być przydatne pole string bo ja tam nic nie wpisałem a mogłem wpisać 'memo' - dzięki temu mógłbym rozpoznać że jeśli pod indeksem 0 jest memo to będę odwoływał się do propertiesów i metod TMemo - zresztą można kombinować z tym na najróżniejsze sposoby


    pozdrawiam

    PS... no chyba że ci chodziło o coś zupełnie innego? ;)

    0
  • #3 07 Maj 2007 22:55
    Sam Sung
    Poziom 30  

    Odpowiednikiem instanceof jest is.
    Wskaźniki do obiektów można przechowywać w kolekcji Objects obiektu TStrings (jak wyżej w poście mirekk36) albo w liście TList, przy czym w pierwszym przypadku elementy są obiektami klasy bazowej TObject i można je od razu rzutować operatorem as, a w przypadku TList są to zwykłe wskaźniki Pointer, które trzeba statycznie zrzutować bądź to od razu na określoną klasę (jeśli trzymamy obiekty jednej klasy), bądź na TObject i następnie użyć operatora instanceof lub as. Wskaźników na obiekty można w Delphi używać jak referencji, ale trzeba pamiętać, że obiekty tworzone dynamicznie muszą zostać ręcznie zwolnione (nie ma garbage collectora). Niszczenie obiektu klasy TList czy też TStrings nie zwalnia pamięci obiektów, do których są tam przechowywane wskaźniki.

    0
  • #4 07 Maj 2007 23:51
    mirekk36
    Poziom 42  

    o właśnie - czyli można się nawet lepiej odwołać do tego obiektu Memo1 czyli:

    (mList.Objects[0]) as TMemo).Lines.Add('jakiś tekst');

    kolega Sam Sung jeszcze dokładniej to wyjaśnił i dobrze podpowiedział, że dynamicznie stworzone obiekty trza "ręcznie" zwalniać. Ale w tym przypadku z wizualnym Memo nie trzeba.

    Ja często wykorzytuję też ten mechanizm np przy tworzeniu wątków, gdzie we własnej produkcji konstruktorze wątku przekazuję też wskaźnik (Pointer) do klasy rodzica wątku dzięki czemu w ten sam sposób mogę bez kłopotu odwoływać się do metod i propertiesów rodzica przez referencję. Ale teraz zamiast pisać np:

    MojaKlasa(ParentPointer).JakaśMetoda

    będę pisał:

    (ParentPointer as MojaKlasa).JakaśMetoda

    bo to jakoś lepiej wygląda

    dzięki też Sam Sung za podpowiedź ;)

    0
  Szukaj w 5mln produktów