Rakentaja

constructor

Pascalissa olio rakennetaan tyypillisesti näin:
Olio := TLuokka.Create;

Mutta olen havainnut että käytössä on muunkin tyyppisiä tapoja. Olisi hyvä saada selitystä näille muille tavoille.

12

467

    Vastaukset 12

    Anonyymi (Kirjaudu / Rekisteröidy)
    5000
    • Ugli

      Pascalissa voi olla useita rakentajia. Tällöin voidaan olio alustaa erilailla vaikka käytössä olisi sama määrä ja samanlaiset parametrit.

      Oliot voidaan alustaa vaikkapa näin

      Olio1 := TLuokka.Create1;
      Olio2 := TLuokka.Create2;

      Tällöin ne on esitelty

      constructor TLuokka.Create1;

      ja

      constructor TLuokka.Create2;

      • Guru tai not

        Moi,

        Eli siis lisäisin vielä tuohon vastukseen hieman lisää tietoa, Olio voidaan alustaa periaatteessa vain yhdellä tavalla, varaamalla sille muistia, joka tapahtuu aina kutsumalla luokan (olion) rakentajaa, rakentajalla voi olla mikä tahansa nimi/nimiä ja sillä/niillä voi olla 0-X parametria, riippuen käyttötarkoituksesta.


      • mies..
        Guru tai not kirjoitti:

        Moi,

        Eli siis lisäisin vielä tuohon vastukseen hieman lisää tietoa, Olio voidaan alustaa periaatteessa vain yhdellä tavalla, varaamalla sille muistia, joka tapahtuu aina kutsumalla luokan (olion) rakentajaa, rakentajalla voi olla mikä tahansa nimi/nimiä ja sillä/niillä voi olla 0-X parametria, riippuen käyttötarkoituksesta.

        Ehkä olen jo wanha, mutta minun aikoina puhuttiin "Muodostin metodeista"??

        Toki voi olla monta muodostin-metodia!, jopa saman nimisiä, kunhan niillä on eri parametrit ja overload; on määritelty lopussa!

        http://www.delphibasics.co.uk/RTL.asp?Name=Overload

        Ei tässä pitäisi olla mitään kummaa! Muodostetaan itse olio muistiin tavalla tai toisella! Niillä vaihtoehdoilla joilla itse olemme sen määritelleet koodissa!


      • poiju-poiju
        mies.. kirjoitti:

        Ehkä olen jo wanha, mutta minun aikoina puhuttiin "Muodostin metodeista"??

        Toki voi olla monta muodostin-metodia!, jopa saman nimisiä, kunhan niillä on eri parametrit ja overload; on määritelty lopussa!

        http://www.delphibasics.co.uk/RTL.asp?Name=Overload

        Ei tässä pitäisi olla mitään kummaa! Muodostetaan itse olio muistiin tavalla tai toisella! Niillä vaihtoehdoilla joilla itse olemme sen määritelleet koodissa!

        Mielestäni nimet:
        - rakentaja constructor
        - purkaja destructor

        kuuvaavat hyvin asiaa.

        Onko joku virallisempi nimipari sitten olemassa?


      • huomaa myös tämä
        mies.. kirjoitti:

        Ehkä olen jo wanha, mutta minun aikoina puhuttiin "Muodostin metodeista"??

        Toki voi olla monta muodostin-metodia!, jopa saman nimisiä, kunhan niillä on eri parametrit ja overload; on määritelty lopussa!

        http://www.delphibasics.co.uk/RTL.asp?Name=Overload

        Ei tässä pitäisi olla mitään kummaa! Muodostetaan itse olio muistiin tavalla tai toisella! Niillä vaihtoehdoilla joilla itse olemme sen määritelleet koodissa!

        Paljon olioita käyttänyt huomaa sen edun että miten kätevää on kun voi käyttää monia rakentajia samoilla parametreillä. Esim. voi luoda hyvin erilaisia olioita vaikka parametrinä on vain yksi boolean tyyppinen muuttuja. Tämä ei onnistu(ne) muilla kielillä vaan niissä joutuu esittelemään vastaavassa tilanteessa useinmpia parametrejä!


      • mies..
        poiju-poiju kirjoitti:

        Mielestäni nimet:
        - rakentaja constructor
        - purkaja destructor

        kuuvaavat hyvin asiaa.

        Onko joku virallisempi nimipari sitten olemassa?

        Mitä nyt vuodesta 1998 ollut olio-ohjelmoinnin kanssa tekemisissä, niin muodostin (muodostinmetodi) ja tuhoaja (tuhoajametodi) :D

        Noh! Sama mitä nimeä käyttää, kunhan itse älyää asian merkityksen parhaiten :)


    • Kokeile toiminta

      Se miten rakentajat (muodostimet) ja purkajat (hajoittimet) toimivat Pascal:ssa tai jossain muussa kielessä kannattaa itse kokeilla esim. seuraavan tapaisella ohjelmalla.
      Lomakkeella on luotu button ja memo komponentti ja muut tarvittavat täydennykset löytyvät alla olevasta listauksesta:


      type

      TForm1 = class(TForm)
         Button1: TButton;
         Memo1: TMemo;
         procedure Button1Click(Sender: TObject);
      private
         { private declarations }
      public
         { public declarations }
      end;

      TLuokka = class
      private
      public
         constructor Create;
         destructor Destroy; override;
      end;

      TLapsiLuokka = class(Tluokka)
      private
      public
         constructor Create;
         destructor Destroy; override;
      end;

      var
         Form1: TForm1;

      ...

      ja implementation -osa

      ...

      procedure Tulosta(s:string);
      begin
         Form1.Memo1.Lines.add(s);
      end;

      constructor TLuokka.Create;
      begin
         Tulosta('TLuokka.Create.');
      end;

      destructor TLuokka.Destroy;
      begin
         Tulosta('TLuokka.Destroy.');
         inherited Destroy;
      end;

      constructor TLapsiLuokka.Create;
      begin
         Tulosta('TLapsiLuokka.Create alkuosa.');
         inherited;
         Tulosta('TLapsiLuokka.Create loppuosa.');
      end;

      destructor TLapsiLuokka.Destroy;
      begin
         Tulosta('TLapsiLuokka.Destroy alkuosa.');
         inherited Destroy;
         Tulosta('TLapsiLuokka.Destroy loppuosa.');
      end;

      procedure TForm1.Button1Click(Sender: TObject);
      var LL:TLapsiLuokka;
      begin
         LL := TLapsiLuokka.create;
         Tulosta('Muu suoritus.');
         FreeAndNil(LL);
      end;


      ...

      Ohjelma tulostaa Memoon nappia painettaessa seuraavan tekstit:

      TLapsiLuokka.Create alkuosa.
      TLuokka.Create.
      TLapsiLuokka.Create loppuosa.
      Muu suoritus.
      TLapsiLuokka.Destroy alkuosa.
      TLuokka.Destroy.
      TLapsiLuokka.Destroy loppuosa.

    • Hyvää selitystä kaipaava

      Joskus tulee sellaisia erikoistapauksia eteen että rakentaja ei ole
      täysin samaa tyyppiä kuin mitä sen olio on. Osaako joku selittää tämän tarkemmin.


      esim.

      var Olio:TStrings;

      ...
      Olio := TLuokka.Create;

      • mies..

        Jos luokka on periytynyt jostain alemmasta luokasta, voidaan olio luoda näin.

        //==================

        TLuokka = class....

        TPeriytyvaLuokka = class( TLuokka )...

        var
        olio: TLuokka;
        begin
        olio := TPeriytyvaLuokka.Create;
        ...
        end;

        Näin sitten myöhemmässä koodissa voidaan tehdä tarkistus..

        if Not ( olio is TPeriytyvaLuokka) then
        begin
        // -> eli olio on muodostettu > TLuokka.Create;
        end;


      • No niin
        mies.. kirjoitti:

        Jos luokka on periytynyt jostain alemmasta luokasta, voidaan olio luoda näin.

        //==================

        TLuokka = class....

        TPeriytyvaLuokka = class( TLuokka )...

        var
        olio: TLuokka;
        begin
        olio := TPeriytyvaLuokka.Create;
        ...
        end;

        Näin sitten myöhemmässä koodissa voidaan tehdä tarkistus..

        if Not ( olio is TPeriytyvaLuokka) then
        begin
        // -> eli olio on muodostettu > TLuokka.Create;
        end;

        Ei taida missään muussa kielessä olion synnyttäminen olla näin monipuolista kuin mitä se on Pascal:ssa ja Delphissä?


      • Mika0800

        imutapa itsellesi ICS (Internet Component Suite), esim. täältä:

        http://www.overbyte.be/eng/products/ics.html

        ja sitten esimerkkiin:

        Jos teet yleisen TWSocket -palvelimen (imuta myös twsocket.hlp ja katso helpistä Listen -metodi), niin:

        Kun palvelimeesi otetaan yhteyttä (esim, jos on TCP -palvelin portissa 80, voit ottaa yhteyttä selaimella näin: http://127.0.0.1/
        )

        niin:

        OnConnectionAvailable -käsittelijässä tyypillisesti luodaan uusi TWSocket TAI sen johdannainen, hyväksytään tuleva yhteys Accept -metodilla ja TWSocket:in Dup -metodilla korvataan TWSocketin Handle Acceptin palauttamalla.

        Tässä voi olla näppärää tehdä näin:

        type

        TOmaSocket = class(TWSocket)

        // muita määrittelyjä tähän ...

        end;

        TSocketType = class of TWSocket;


        var
        MySocketType : TSocketType = TWSocket;


        ja sitten em. OnConnectionAvailable -käsittelijässä:

        var
        ANewConn : TWSocket;

        begin

        //

        ANewConn := MySocketType.Create(nil);

        // nil:in sijasta voit laittaa omistajaksi jotain, joka osaa huolehtia vapautuksesta, mutta vasta, kun luotua oliota ei enää tarvita.

        ...

        Tässä siis oletuksena luodaan TWSocket -tyyppinen olio.

        Mutta voit esim. jostain toisesta UNITista käsin tehdä näin:


        MySocketType := TOmaSocket;



        Tällöin tuon jälkeen, jos/kun uusia yhteydenottoja tulee, niitä varten ei luodakaan TWSocket -tyyppistä oliota, vaan TOmaSocket -tyyppinen olio.

        Vastaavasti, esim. TMemo -tyypin näkyvä Lines -kenttä on TStrings -tyyppiä, mutta sen sisäiseen toteutukseen on käytetty TMemoStrings -tyyppiä.

        Samoin vaikkapa voit määritellä:

        var
        S : TStream;

        ja koodissa, riippuen, mitä milloinkin halutaan, esim:

        S := TFileStream.Create(Filename, fmOpenRead);

        TAI

        S := TMemoryStream.Create;

        TAI

        S := TStringStream.Create('HALOO 0800.');

        ja mikä tahansa noista vapautetaan näin:

        FreeAndNil(S);


      • Mika0800
        No niin kirjoitti:

        Ei taida missään muussa kielessä olion synnyttäminen olla näin monipuolista kuin mitä se on Pascal:ssa ja Delphissä?

        Aivan, ja esim. Javaan verrattuna Delphi on kieleltään monipuolisempi, mm. vaikka molemmissa on oliot, Delphillä voi myös kirjoittaa itsenäisiä proseduureja, jotka eivät ole osa olioita, sekä tarvittaessa käyttää näitä:

        {$ifdef JokinEhto}

        // koodia

        {$else}

        // vaihtoehtoista koodia

        {$endif}

        Lisäksi Delphissä on säikeistä ohjelmointia varten selkeästi erikseen TCriticalSection, TEvent jne, eikä niiden korvikkeeksi sekavaa Monitor -konseptia kuten Javassa.

        Delphi on monessa yrityksessä aliarvostettu.

        Tosiasiassa Delphi on osaavissa käsissä erittäin pätevä työväline, nopeudeltaan oikein käytettynä samaa luokkaa kuin C/C , mutta niitä (sekä Javaa) huomattavasti selkeämpää.


    Ketjusta on poistettu 0 sääntöjenvastaista viestiä.

    Luetuimmat keskustelut

    1. Venäjä alkaa iskemään Suomen politiikkaan.

      Tässä on valtion ja koko länsiliiton päämiehet varoitelleet, että Venäjä alkaa talven aikana taas iskemään hybridisesti.
      Sinkut
      237
      1471
    2. Hallituksen järjestämä spektaakkeli tuo vessanpyttykeissi

      Että olisi kymmenien kansanedustajien kodeissa käyty ihan tuosta vaan, eikä kukaan kansanedustaja kerro niin käyneen, va
      Maailman menoa
      282
      1043
    3. Miltä tuntuu vanhempi nainen olla

      Pihkassa huomattavasti nuorempaan kolliin joka on uskollinen ja kiltti ja tottelee joka asiaa ja tykkää pussailla ja pan
      Ikävä
      94
      814
    4. Sysmän "ilon päivä"

      Ja taas palaa hirveä määrä verorahoja, ihan turhaan soopaan. Eikö nämä jotka kuntapolitiikassa valittavat ja tuhoaa vaan
      Sysmä
      68
      772
    5. Uskon, että saataisiin kaikki selvitettyä

      Mutta yhteys on jäissä, minä olen jäässä, enkä osaa tai uskalla enää lähestyä. Se vaan on niin. Naiselta Jos ei ole hyvä
      Ikävä
      48
      723
    6. Pakko myöntää mies

      En mä aina ihan rehellinen sulle ollut
      Ikävä
      110
      619
    7. Joka ilta mietin

      sua❤️Mitä teet, missä meet? Kaipaatko yhtään? Yön tullen toivotan mielessäni sulle hyvää yötä ja aamuisin huomenet. Joka
      Ikävä
      27
      585
    8. Riitastako pelastaja

      Riitta jätti hakemuksen. Hyvä niin. On ainakin yksi mistä ottaa. Pertsa ei taida aikuistua koskaan ja Pekka hoiteli silt
      Kemijärvi
      34
      574
    9. Timo Vornanen.

      On siinäkin yksi täystampio. Eipä ihme, että persukannattajat sen eduskuntaan äänestikin.
      Maailman menoa
      46
      548
    10. Luottamus

      Luotan vain siihen mitä tapahtuu IRL. Anonyymipalstan vihjailut eivät merkitse minulle mitään.
      Ikävä
      94
      525
    11. mielikuva

      Mitä luulet hänen ajattelevan sinusta?
      Ikävä
      41
      501
    12. 32
      481
    13. Kadutko mies sitä miten reagoit?

      ..siihen sotkuun, jonka jälkeen mikään ei ole ollut kuin ennen. 🥺
      Ikävä
      48
      465
    14. Millaisen talvitakin haluaisit?

      Talveen vielä aikaa, mutta talvitakit tulleet kauppoihin. Millainen olisi unelmiesi talvitakki? Itse tykkäisin jostain
      Sinkut
      77
      451
    15. 32
      429
    16. Mikä kaivatullesi

      On tärkeintä elämässään?
      Ikävä
      31
      429
    17. Olisitko nainen ihan nolona

      Jos et saisikaan sitä nousemaan...
      Sinkut
      77
      412
    18. Onko kahvila Retro samalla pub???

      Netin mukaan anniskeluoikeudet. Käykö tuolla kaljoitteluporukkaa? Onko iltaviihdettä? Olen muuttamassa marraskuussa Kuhm
      Kuhmo
      8
      407
    19. Oletteko täyttä sataa?

      Muuta etunimienne kirjaimet numeroiksi. Esim. Mia ja Risto siitä tulee 8 numeroa. Laske ne yhteen . Paljonko tulee?
      Ikävä
      33
      400
    20. Iivari esittää poliisin tutkintaa

      Siikalatvan kunnanjohtaja Pekka Iivari on pannu ison pyörän liikkeelle. Entinen Kemijärven historian lyhimmän kaupunginj
      Kemijärvi
      21
      381
    Aihe