Mis vahe on betoonklassidel ja abstraktsetel klassidel?


Vastus 1:

Ainus erinevus on see, et konkreetse klassi saab realiseerida, kuna see pakub (või pärib) kõigi selle meetodite rakendusi. Abstraktset klassi ei saa kiirendada, kuna vähemalt ühte meetodit pole rakendatud.

Abstraktsed klassid on mõeldud laiendamiseks. Kui nad pakuvad rakenduse kohta üksikasju, saavad seda kõikides lasteklassides uuesti kasutada. Erijuhtum on puhas abstraktne klass, mis ei anna üldse rakendust. Need klassid ei aita koodi taaskasutamisel, mis muudab need põhimõtteliselt erinevateks. Seda erinevust kirjeldavad kaks pärandiliiki:

  1. Rakenduse pärand - pakub mehhanismi koodi taaskasutamiseks. Liidese pärand - pakub alamtüüpide mehhanismi.

Kui B-klass laiendab klassi A, ei tähenda see tingimata, et B on A. See võib lihtsalt tähendada, et B pärib mingi koodi A-lt. See pole alati selge ja mõned keeled seostavad seda alamtüüpimisega.

Java on näide keelest, mis pakub alamtüüpimiseks erinevat konstruktsiooni, mida nimetatakse liideseks. Liidesed on põhimõtteliselt puhtad abstraktsed klassid. Kui B-klass rakendab liidest A, siis B on A.

Kui keel eraldab rakenduspärandi liidese pärandist, on võimalik käsitleda teatud probleeme erinevalt. Näiteks:

  1. Java kõrvaldab mitme pärimise keerukuse, keelates klassil olla kaks superklassi. Klassil on aga vabadus rakendada suvalist arvu liideseid. Lihtsam on järgida kompositsiooni eelistamise põhimõtet pärimise asemel. Liiga paljude klasside laiendamine võib viia keerukate klassihierarhiate tekitamiseni, kuid liiga paljude liideste rakendamine pole nii suur probleem. Programmi kaudu täitmise voo jälgimisel ei saa liidesed seda keeruliseks muuta, kuna need ei sisalda ühtegi käivitatavat koodi.

Vastus 2:

Abstraktsed klassid on tavaliselt osalised või puuduvad üldse. Teisest küljest rakendavad betooniklassid selle käitumist alati täielikult. Erinevalt betooniklassidest ei saa abstraktseid klasse kiirendada. Seetõttu tuleb abstraktseid klasse laiendada, et need oleksid kasulikud. Abstraktsed klassid võivad sisaldada abstraktseid meetodeid, kuid konkreetsed klassid seda ei saa. Abstraktse klassi laiendamisel päranduvad kõik meetodid (nii abstraktsed kui ka konkreetsed). Päritud klass saab rakendada kõiki või kõiki meetodeid. Kui kõiki abstraktseid meetodeid ei rakendata, muutub see klass ka abstraktseks klassiks.


Vastus 3:

Oletame, et mõlemal klassil on olemas liides.

Betooniklass rakendab kõiki liideste meetodeid ja saab seda ilma täiendava abinõuna kasutusele võtta.

Kui soovite mingil põhjusel jätta teatud meetodite rakendamisest välja (näiteks soovite kirjutada liidese kaks rakendust, mis erinevad üksteisest vähe), kirjutate abstraktse klassi, mida ei saa otsekohe realiseerida. Abstraktse klassi kiirendamiseks kirjutage kas konkreetne alaklass ("laieneb"), kus rakendate ülejäänud meetodid, või pakute viimase realiseerimisel (mis on tehniliselt sama: "kirjutasite betooni alaklassi", kuid see on anonüümne).


Vastus 4:

Oletame, et mõlemal klassil on olemas liides.

Betooniklass rakendab kõiki liideste meetodeid ja saab seda ilma täiendava abinõuna kasutusele võtta.

Kui soovite mingil põhjusel jätta teatud meetodite rakendamisest välja (näiteks soovite kirjutada liidese kaks rakendust, mis erinevad üksteisest vähe), kirjutate abstraktse klassi, mida ei saa otsekohe realiseerida. Abstraktse klassi kiirendamiseks kirjutage kas konkreetne alaklass ("laieneb"), kus rakendate ülejäänud meetodid, või pakute viimase realiseerimisel (mis on tehniliselt sama: "kirjutasite betooni alaklassi", kuid see on anonüümne).