wiki:PerintaVsRajapinta
Last modified 5 years ago Last modified on 2013-04-08 09:38:34

Perintä vs. rajapinta

Yhteistä:

  • molemmat mahdollistavat polymorfismin (eli voidaan käyttää olioviitettä jossa olio voi käyttäytyä oliosta riippuen eri tavalla. vrt Elain-tyyppinen olio voi olla esim Kissa tai Koira ja käyttäytyä siis vastaavalla tavalla).
  • polymorfismista on hyötyä aliohjelmakutsuissa kun aliohjelmalle viedään olio ja olion mukaan voi toimi hyvin eri tavalla.
  • molemmat tuovat näkyville saman rajapinnan, eli voidaan luottaa että tietyt metodit löytyvät kohteena olevasta oliosta

Eroa:

  • rajapinta (interface) on "sopimus" siitä että ainakin nämä toiminnot (metodit) tulevat löytymään jokaisesta oliosta jonka luokka väittää toteuttavansa (implements) rajapinnan
  • rajapinta ei auta luomaan metodeja (tosin Eclipsessä kun esittelee luokan joka toteuttaa rajapinnan, niin jos metodeja puuttuu, valittaa niistä ja korjauksella saa luomaan tyhjät rungot metodeille).
  • perinnällä (extends) saadaan "ilmaiseksi" käyttöön kaikki ominaisuudet (metodit ja attribuutit) jotka ovat perittävässä luokassa.
  • perintä on tavallaan koodarin apua vähentäen kirjoittamista
  • jos kanta luokkaa muuttaa, muuttaa vastaavasti jokainen peritty luokka
    • hyvä puoli: vikoja voidaan korjata ja ominaisuuksia lisätä näin
    • huono puoli: vikoja voidaan tehdä lisää ja rikkoa jonkin jo toiminutta koodia. Tämän vuoksi jotkut tahot haluavat kieltää koko perinnän.

Kumpiko tehdä?

  • yleensä tehdään ensin rajapinta
  • sitten jotta rajapinnan toteuttavia luokkia olisi helpompi tehdä, tehdään joku peruskanta-luokka, josta perimällä saadaan omia uusia luokkia vähemmällä työllä:
  • perinnän avulla sitten itse toteutus on helpompi
  • aliohjelmille esitellään yleensä rajapinta-tyyppisiä parametrejä jolloin voidaan viedä parametrina aivan toisella tavalla toteutettuja juttuja kuin mitä perinnän kautta on ajateltu (mutta ei välttämättä).
  • esim. Graphics-kirjaston luokat tallettavat ja käsittelevät Drawable -luokan edustajia ja näin pystyy käsittelemään mitä tahansa oliota joka toteuttaa tämän rajapinnan.
  • ilman perintää pärjättäisiin täysin. Mutta koodaamistyön määrä kasvaisi.
  • perinnän ja rajapintojen väliin tulee abstraktit luokat, joissa vähintään yksi metodi on toteuttamatta ja näin tästä luokasta ei voida luoda olioita (kuten ei myöskään rajapinnasta voi luoda olioita tekemättä toteuttavaa luokkaa). Eli abstrakti luokka pakottaa perintään ja puuttuvien metodien toteuttamiseen, mutta voi silti tuoda koodausapuna toteutuksen suureen osaan tarvittavista ominaisuuksista, ks esim:
    • BasicShape - puuttuu drawShape metodin toteutus, mutta tehty kaikki väriin yms liittyvät asiat valmiiksi
    • PerusKentta - puuttuu itse kentän sisällön attribuutti, mutta muut tehty valmiiksi.

Muita linkkejä