Supracomandarea și Supraîncărcarea

Moștenească. clasă de obiecte

Înainte de a continua discuția noastră de moștenire, aș dori să se concentreze pe un singur punct important. După cum am văzut, pentru a putea moșteni de la orice clasă pe care trebuie să scrie cuvântul se extinde după numele noii clase și numele clasei din care dorim să fie moștenită. Dar am văzut deja exemple în care se extinde fără cuvinte, nu am. Asta înseamnă că această clasă este „roca de bază“. Sau, cu alte cuvinte - nu este moștenit de la oricare din clasa arbitrară cu totul. Acest lucru nu este așa. Setul standard a claselor Java, există aceeași, „piatra de temelie“ - clasa Object, care este moștenit de la o clasă care nu are nici un cuvânt se extinde. Nu specificând o clasă derivată, vă spun în mod automat compilatorul pe care le moștenesc din clasa Object.
Ie Clasa de determinare sunt enumerate mai jos aceleași

public class SimpleClass <…>
public class extinde SimpleClass obiect <…>

Puteți utiliza ambele forme, dar, în practică, nimeni nu scrie extinde obiect. Vom fi sigur de a vorbi despre clasa Object, care are unele metode destul de utile, dar acum ne-am menționa despre existența și rolul său foarte important în întreaga ierarhie de clase - de la el în cele din urmă a creat toate clasele - este bunicul lor, stră-bunicul, și poate prapraprapradedushka.

Supracomandarea și supraîncărcare (suprascriere și suprasarcina)

Anterior, ne-am uitat la un exemplu de modul în care puteți adăuga funcționalitate la clasa prin extensia sa (moștenire). Dar clasa poate adăuga nu numai caracteristici noi prin crearea de noi metode. Metodele de clasă pot, de asemenea, suprascrie - suprasolicitați. Sau suprasarcină - face suprasarcină. Să încercăm să înțelegem ce fiecare termen.

Override (suprascrie)

Redefinirea este utilizat atunci când suprascrie (modifica, suprascrie) metodele existente. De exemplu, în clasa Object are o metoda toString foarte popular (), care returnează o reprezentare șir de caractere a obiectului. În punerea în aplicare a rezultatului obiect este destul de urât - numele clasei cu niște numere (așa-numitele hash-code). Să facem un exemplu foarte simplu

Cel mai important lucru este de a descrie clasa de robot, și anume o metodă nouă toString (). Să-l considerăm mai detaliat.
Ea începe metoda de proiectare @ Suprascriere misterios. acest design este „Rezumat“ este numit. Folosit pentru a include informații suplimentare care pot fi citite și utilizate. Vom examina mai târziu rezumatul, acum amintesc doar că desenul sau modelul, care începe cu caracterul „@“ sunt adnotările și nu ar trebui să fie teamă :). Pentru moment, rețineți că metodele pe care le imperative, este mai bine să anticipeze această adnotare. În acest caz, compilatorul poate să verifice că suprascrie o metodă, mai degrabă decât a scrie unul nou. Astfel, puteți evita unele greșeli din cauza neatentiei.

IMPORTANT. Adnotările apar numai în versiunea de Java 1.5 și versiunile anterioare nu le suporta.

Ei bine, atunci totul este foarte simplu - metoda toString din titlu ar trebui să fie exact la fel cu aceeași metodă din clasa strămoș - nume, valoarea de returnare, precum și o listă de opțiuni. În acest caz, nu avem parametrii și valoarea returnată este un șir de caractere. Acum avem o clasă care suprascrie metodele existente strămoș. Astfel, este posibil să se schimbe funcționalitatea unei clase și comportamentul său. Și vă rugăm să rețineți că noi nu am folosit codul sursă al obiectului de clasă - aceasta noi nu facem. Cu toate acestea, am reușit să-și schimbe comportamentul. Acesta este un avantaj mare atunci când în curs de dezvoltare de programe. În viața obișnuită, un programator Java întotdeauna ceva moștenește, suprascrie. Dar ar trebui să notăm câteva puncte importante.

Să considerăm un exemplu folosind vechiul nostru prieten de robot. Deci, aici e robotul nostru, care este capabil să se deplaseze de la un punct la altul. Am făcut acest exemplu, astfel încât cu greu ar trebui să surprindă. Singurul plus - acum am folosi pachete.

Destul de greu de înțeles necesitatea redefinirii nerealizând inițial posibilitățile metodei / s.
Înțeleg că în construcția de «Graphics g» scrisoare «g» nu este o opțiune, este numele și poate fi schimbat la orice alt exemplu: «Grafica oval», etc. Oval transformat într-un obiect cu un set de metode și vsoystv.
Pe baza înregistrării «Oval.drawOval (5, 5, getWidth () - 10, getHeight () - 10)“ este o parte a formei noastre oval odata ce poate primi date despre lungimea și lățimea matriței, astfel în mod direct.
Foarte bate că toate tranzacțiile (dacă nu mă înșel) a făcut cu privire la proprietățile și metodele de aceeași formă, dar a trebuit să scrie trei clase. Este dificil de a urmări relația dintre clase, nerealizand formă oportunități.
Deși modul în care doar pentru exemplul problemei descrie proprietățile obiectelor utilizate nu a fost pus.

Ie dacă am înțeles corect, în acest caz - «JComponent» este un tip de hârtie set de papetărie + creion + pictor (care au nevoie de instrucțiuni pentru desen), «Grafica» un set de instrucțiuni pentru desen + manager de Painter (pe parametrii setați) și «JFrame» l masa pe care hârtia de desen pus?

Scuză-mă, de asemenea, doresc să analizeze în detaliu fragmentul de cod:
@ Suprascriere
protejate void paintComponent (Graphics g) super.paintComponent (g);
// folosi elemente grafice pentru a desena oval
// alin
g.drawOval (5, 5, getWidth () - 10, getHeight () - 10);
>
Am trecut de un obiect grafic în metoda clasei părinte, care este, fără redefinirea în sine pentru a trage ovalele nu putea, și apoi utilizate metodele încorporate ale părinte clasa «JComponent» pentru a calcula lățimea și lungimea dreapta?

Da, ideea este absolut corectă. Obiecte în acest fel și ar trebui să fie percepută.
Există JComponent - Clasa-martor. El are o paintComponent metodă, care va fi numit atunci când este vopsit. Și l-am avea în înlocuirile clasa mea.
Dacă sapi mai adânc, atunci când forma începe să tragă, se execută în jurul valorii de lista componentelor sale, pe care a (am numit metoda de adăugare în forma și transferat la aceste componente - pe care le-au acum e). Fiecare componentă (pentru că sunt moștenitorii unei singure componente de clasă) este cauzată de metoda de vopsea.
În interiorul metoda de vopsea JComponent invocă paintCOmponent - astfel încât a decis să dezvoltatorilor, ei știu mai bine.
Dar, cel mai important, din cauza polimorfismului de vopsea din JComponent (pentru că nu am suprascrisă) este deja paintComponent noastră. Ie Clasa noastra are o vopsea (pentru că el era moștenitorul JComponent), care determină paintComponent (această metodă am redefinit) și la numit paintComponent nostru, în loc de JComponent (care este esența polimorfismului - o funcționare foarte cool în viitor).

Vă mulțumesc foarte mult, am citit deja capitolul următor și imobiliare de lucru Chirie înțeles cel puțin parțial esența polimorfism. Într-adevăr rece ... ei bine, asta e un exemplu destul de banal (doar pentru distracție) - presupunem există un fel de clasa „A“ (Manager de raportare) în sistemul bancar, care dă atribuirea către o altă clasă „B“ (Rapoarte Designer) pentru a face un raport cu privire la activitatea desfășurată, și aici suprascriem ingenios metode părinte din clasa „B1“ derivat (proiectant ochotov + transfer de bani într-un cont) și apoi luați următorul pas în organizarea raportului de apel:

linie
"B" = nou «B»
schimba pe
"B" = nou «B1»

și după fiecare dată când solicitați un raport privind stabilirea obține unele bonus ca o marire de salariu, iar rapoartele managerul chiar nu a dat seama că au existat unele schimbări 🙂

Din nou mă concentrez pe faptul că exemplul exagerat (pentru rade), iar scopul său este doar de a întreba dacă am înțeles corect sensul polimorfism 🙂