next up previous
Next: Polimorfizem z vzorci / Up: Polimorfizem Previous: Polimorfizem

Ad-hoc polimorfizem

Najprej bomo uporabili polimorfizem, ki se imenuje ad-hoc polimorfizem ali drugače - za silo narejen polimorfizem.

Razlika med int, float, ... polimorfizmi je v velikosti obsega in tako prostora v pomnilniku, ki ga zaseda en predmet posameznega razreda (tipa). Če vemo kje je element in kako velik je, lahko naredimo izvedbeni modul neodvisno od int, float, ...

Izhajali bomo iz razreda skladov celih števil SKLAD_NO.h in opisali potrebne spremembe na njem. Najprej kreatorju dodamo parameter, ki pove, koliko prostora zavzame en element (predmet) naložen na sklad.

Zakaj imamo sedaj dva kreatorja? (ponovitev)

Ta dva kreatorja sedaj razširimo na:

kjer velElt opisuje koliko prostora zasede en predmet naložen na sklad. To velikost dodamo med privatne stvari razreda skladov.

Poleg tega spremenimo še ostale funkcije:

V izvedbenem modulu sta spremenjene funkcije za nalaganje, zlaganje in vračanje vrha. Za razliko od starega nalaganja, kjer je bil predmet prenešen po vrednosti in smo ga lahko v enem kosu naložili na sklad, moramo pri novem nalaganju to početi po koščkih. En košček je veliko kot en znak (char), njihovo število pa je določeno ob kreiranju - velElt:

for(i= 0; i < velElt; i++)
  ptr_skladisce[zadnji][i]=element[i];

Sedaj lahko uporabljamo naš ad-hoc polimorfni razred skladov predmetov na naslednji način:

int main() {
  Sklad s1(sizeof(int));      // kliče: Sklad(velElt)
  Sklad s2(sizeof(int), 3);   // kliče: Sklad(velElt, min_vel_sklad)
  Sklad s3(sizeof(float));
  Sklad s4(sizeof(Crac));
  int i;
  float f;
  Crac r;

  s1.Nalozi(&i);
  s2.Nalozi(&i);
  s3.Nalozi(&f);
  s4.Nalozi(&r);

  return 0;
}; // main
Žal po nesreči lahko napišemo tudi:
  s4.Nalozi(&i);
in naš program bo deloval napačno. Formalno gledano smo kršili pogodbo, saj predpogoj zahteva, da je sklad s4 sklad racionalnih števil in ne celih.


next up previous
Next: Polimorfizem z vzorci / Up: Polimorfizem Previous: Polimorfizem

Andrej Brodnik (Andy)
Fri May 22 13:56:34 MET DST 1998