Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Pieni kysymys

Snifferi [01.02.2006 16:05:52]

#

Elikäs homman nimi seuraava:

Kun räpellän tässä taas jotakin Composite -suunnittelumallia käyttäen:

Kun yliluokassa on esim. abstrakti metodi

public abstract void addComponent(Integer i, Component c);

Yliluokalla on kaksi aliluokkaa, joista toinen (Composite -luokka) on ns. koosteluokka, ja se määrittelee esim. tuon abstraktin metodin itselleen sopivaksi.

Sitten toinen aliluokka, joka ei siis toimi koosteluokkana, perii myös yliluokan abstraktit metodit. Se ei voi kuitenkaan toteuttaa niitä, koska se on vain "lehtiluokka". Kysymys siis kuuluu: Millä tavalla kannattaa hoitaa tuossa lehtiluokassa abstraktien metodien "toteutus"?


Itse olen tehny näin:

public void addComponent (Integer i, Component c) {}

Eli siis tyhjä metodi. Nyt aliluokka "toteuttaa" yliluokan abstraktin metodin sillä tavalla, ettei kääntäjä napise.

Kääntäjästähän tuo pölähtää läpi iloisesti ja ohjelman logiikka pelittää kuten pitääkin.

Onko olemassa mitään "siistimpää" (=parempi ohjelmointikäytäntö) tapaa hoitaa tuo homma?

FooBat [01.02.2006 22:32:12]

#

Tässä voi tietenkin miettiä onko lehtiluokan järkevää periä tuollaista Composite yläluokkaa, joka olettaa, että sille lisätään komponentteja. Itse tekisin tuon varmaan niin, että perisin Composite ja Leaf-luokat erikseen component-luokasta (tai toteuttaisin jonkun interface:n). Jos taas käytät jotain valmista kankeaa luokkamallia ja haluat tehdä asian noin kuin olet esitänyt, niin ei ole paljon vaihtoehtoja esittämällesi tavalle. Itse lisäisin metodin kuitenkin heittämään jonkinlaisen virheilmoituksen sen sijaan, että se ei tekisi mitään. Tällöin lehtikomponentin vääränlainen käyttö havaittaisiin helpommin.

public void addComponent (Integer i, Component c) {
  throw new RuntimeException("Oi, u r not supposed to b 'ere!")
}

Snifferi [02.02.2006 12:43:20]

#

Jeps, onhan tuo mun tapa aika kämänen tapa hoitaa homma. Taidanpa kuitenkin laittaa ton sun mainitseman poikkeuksen vielä tohon metodiin. Koko ohjelman rakennetta ei enää kehtaa lähtä muuttaa...

Homman nimi oli siis se, että Composite -mallia pitää tulla noudatettua, ja nyt sitä taitaa tulla sitten noudatettua ainakin riittävän tarkasti ;D

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta