De ce o clasă abstractă în Java - stiva de preaplin în limba rusă

Java de învățare recent. Am blocat pe faptul că nu pot să înțeleg rolul clasei abstracte în Java. În cartea (nu doar unul) a găsit un exemplu care descrie rolul clasei abstracte:

Dar transformat dintr-o clasă abstractă obișnuită, și chiar ștergerea acestuia cu totul program nu a încetat la locul de muncă:

Vă rugăm să descrieți un exemplu în care eliminarea unei clase abstracte (sau „meșterit“ la normal) este imposibilă și va rezulta într-o eroare, sau să explice situațiile în care o clasă obișnuită nu înlocuiește abstract. Multumesc anticipat.

set 16 octombrie '11, la 09:55

Ce manual, în cazul în care nu secretă? În decente Java-cărți încă mai sunt coloana vertebrală a OEP.

Linia de jos este aceasta. Atunci când marcați o clasă abstractă. vă interzis prin prezenta să creeze instanțe. Deoarece clasa Funcționare metoda calculează nu este definită. nu ar trebui să fie capabil de a crea instanțe ale acesteia:

În cazul în care o clasă nu este metode abstracte, a „cârpăceala“ în felul său obișnuit în sine nu arată în exterior. Pur și simplu va fi capabil de a crea o instanță a acestei clase.

Este în „modificarea“ dumneavoastră ați identificat corpul pentru a calcula metoda. schimbând astfel logica restului ierarhiei. Dacă creați acum un alt copil din clasa de operare și de a defini calcula metoda. se va utiliza o implementare a clasei părinte, care este de a calcula produsul a două argumente.

și chiar elimina cu totul program nu a încetat la locul de muncă:

Nu-mi vine să cred. Dacă ați scos clasa operației pe care ar trebui să se pronunțe cu clasele de copii (se extinde pentru a curăța și edita principal). De asemenea, după cursurile dvs. Adunările și scăderile să devină independente unul față de celălalt.

În general, clase abstracte sunt utilizate pe scară largă atunci când aveți nevoie pentru a pune în aplicare unele funcționalități comune pentru clasa de familie.

Tutorial - Cursul de prelegeri cu privire la programarea MIPT în Java de fapt, am făcut acest lucru ( „va trebui să modificați clasele de copii (se extinde pentru a curăța și edita principal)“). adică cu alte cuvinte, o clasă abstractă este interzisă pentru a crea copii de ei înșiși și generalizează funcționalitate similară clasă (copil)? și o altă întrebare pe baza programelor de mai sus scrise (a mea): Care sunt avantajele „trunchiat“ Operațiunea obiect o3 = new Scadere (); De-a lungul „complet“? Scadere o3 = new substracție (); - arachnoden 16 octombrie '11, la 10:35

Obiectul nu este tăiat. Această utilizare a principiului polimorfism. Noi declarăm un obiect ca aparținând unei clase mai largi și atribuiți-i o realizare concretă a unei clase copil. Acest lucru asigură interșanjabilitate copil clase: nu ne pasă că a alunecat, lucrăm în mod constant cu obiecte. Trebuie să înceapă să se ocupe cu principiile fundamentale ale OEP. În ceea ce privește Java ECKEL citește ceva ( „filozofie Java“). - Nofate ♦ 16 octombrie '11, la 10:39

Stimați colegi, în opinia mea, desigur, nu este destul de adevărat accentul pus. Prima clasă abstractă - nu este cu siguranță o clasă care nu pot fi create, iar punerea în aplicare de clasă este separată de declarația sa.

Abstracție în sens general, această separare de detaliu. În cazul nostru, aceasta este declarația clasei fără griji despre punerea sa în aplicare. Dar punerea în aplicare, în fiecare caz, poate fi diferit - uneori complexe, uneori simplu. O clasă abstractă nu are nici o implementare.

Voi încerca să dau un exemplu din viața reală:

  1. Să presupunem că vrem să descrie metodele de asamblare și dezasamblare diferite de mobilier, pentru care o clasă de mobilier dat
  2. În acest caz, clasa abstracta mobilier tipic cu două metode abstracte: asambla și dezasambla. Deoarece metodele de asamblare și demontare a mobilierului depinde de modelul particular, nu este posibil să se descrie mobilierul clasei, așa că le declara ca fiind abstracte.
  3. dat mai mult tabelul de clasă. care moștenește de la clasa de mobilier. care să pună în aplicare metode Collect / înțeleg - bine, ceva de genul: fixați picioarele, apoi iată și așa mai departe.
  4. Mai mult canapea dat de clasă. care moștenește de la clasa de mobilier. în cazul în care metodele de punere în aplicare din nou Collect / Collate - acum: fixați scaune, cotiere și apoi așa mai departe.

Apoi începe cel mai interesant și important pentru ceea ce este de fapt întregul circ cu cai și a fost conceput:

  • În cazul în care nu au existat clase abstracte este ansamblul de master este adus la masă și canapea. Ei bine, de tip - maestru vede că acest tabel ia instrucțiunile de asamblare și de colectare a acestora. El ar trebui să știe exact că este o masă sau o canapea altfel țeavă - asamblare nu are loc.
  • Dacă există un expert de clasă abstractă nu aduce o masă sau o canapea. și doar un fel de mobilier. Master în general, că tamburul este o masă sau o canapea sau chiar un dulap. Maestrul scoate de mobilier atașat la foaia de instrucțiuni și colectează-l.

Răspuns 24 decembrie la 08:56 '13

De exemplu, scrie contul aeronavei la sistemul aeroportului. Există marfă și pasageri avioane și trebuie să, de exemplu, că a existat o listă de aeronave care sunt acum la aeroport. Efectuarea abstract de clasă „aeronavei“ (nu știm dinainte ce va acoperi avionul) și impuneți un câmp de bază potrivit pentru orice aeronavă (viteza de zbor și lungimea, de exemplu)

În continuare, vom crea două clase, una pentru aeronave de pasageri și unul pentru marfa, iar fiecare are spetseficheskie parametrii să-l adaugă

Mai mult, în clasa cu toată această afacere va lucra, de a crea o listă și împinge pentru a obține acele avioane care zboară

Acum, în principiu, este clar că avem o listă cu aeronava, și care - nu foarte importante. Pentru mine, principala caracteristică a claselor abstracte este că, prin utilizarea ei, puteți specifica logica, nu-și dea seama.

Răspuns 16 '11 octombrie, la 10:33

Vă rugăm să nu uitați să execute codul. - Nofate ♦ 16 octombrie '11, la 10:43

Vă mulțumesc, trebuie să învețe un pic mai mult. - arachnoden 16 octombrie '11, la 11:17

De fapt, principala diferență dintre o clasă abstractă de obicei constă doar în faptul că este imposibil de a crea un obiect de clasă abstractă și, prin urmare, este numai pentru suprareglările. Și primul exemplu de greșit, pentru că nu există nici o legătură între clasele de adăugare, și funcționare Scădere. Un exemplu poate fi văzut, de exemplu, aici.