Rakentaja

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.
12467
Äänestä

Muut lukivat myös

Vastaukset 12

Vanhimmat

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;

Äänestä
  • 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.

    Äänestä

  • 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!

    Äänestä

  • 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?

    Äänestä

  • 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ä!

    Äänestä

  • 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 :)

    Äänestä

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.

Äänestä

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;

Äänestä
  • 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;

    Äänestä

  • 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ä?

    Äänestä

  • 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);

    Äänestä

  • 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ää.

    Äänestä

Kommentoi aloitusta


constructor kirjoitti:

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.

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu