2011. március 17., csütörtök

Absztrakt osztályok és interfészek

Egy osztályt az abstract kulcsszóval absztrakt osztályként lehet deklarálni, ami annyit jelent, hogy tartalmazhat absztrakt metódusokat. Absztrakt osztályt nem lehet példányosítani, csak más osztályt származtatni belőle, aminek meg kell adnia az esetleges absztrakt metódusok implementációját (ha nem adja meg az implementációkat, akkor a származtatott osztályt is absztraktként kell deklarálni).

Egy metódust szintén az abstract kulcsszó használatával lehet absztrakt metódusként deklarálni és nem adhat meg implementációt, azaz csak deklarálni kell.

Absztrakt osztály tartalmazhat static mezőket és/vagy metódusokat is, ezeket ugyanúgy osztályreferencián keresztül lehet elérni, mint normális esetben.

Absztrakt osztály és interfész közötti különbségek

  • az absztrakt osztály hasonló az interfészhez, de megadhat részleges implementációt, amit a származtatott osztályok egészíthetnek ki
  • ha ansztrakt osztályunk csak absztrakt metódusokat tartalmaz, akkor azt inkább interfészként kell deklarálni
  • az interfészek biztosítják a Java nyelvben a többszörös öröklődést; egy osztály több interfészt is implementálhat egyszerre, függetlenül attól, hogy azok mennyire állnak kapcsolatban egymással (pl. Serializable, Comparable, Cloneable stb.)
  • az absztrakt osztály leszármazott osztályai közös implementációt is tartalmaznak (az absztrakt osztályban nem absztraktként definiált metódusok), de egyedi viselkedést is megadnak (ezek az absztrakt metódusok)
  • absztrakt osztály tartalmazhat nem static és final mezőket is
  • interfészekben minden metódus implicit absztraktként van deklarálva
Absztrakt osztály mint interfész implementáció

Ha egy osztály implementál egy interfészt, akkor annak minden egyes metódusát implementálnia kell. Ez alól egyetlen kivétel az absztrakt osztály. A fordító akkor sem fog panaszkodni, ha az interfész metódus meg sem jelenik, mint absztrakt metódus az absztrakt osztályban. Ezeket majd a származtatott osztályokban kell csak implementálni.

2 megjegyzés: