Abu naudoja metodo vardą, tačiau jie yra iš esmės skirtingi. = tas pats vardas, , toje pačioje klasėje, išsprendžiamas . = subklasė pirminės klasės metodą , išsprendžiamas .
Abu naudoja metodo vardą, tačiau jie yra iš esmės skirtingi. = tas pats vardas, , toje pačioje klasėje, išsprendžiamas . = subklasė pirminės klasės metodą , išsprendžiamas .
| Perkrauna | Perrašymas | |
|---|---|---|
| Parašas | Turi skirtis (parametrai) | Turi būti identiški |
| Ryšys | Toje pačioje klasėje | Pirminė klasė ↔ subklasė |
| Išsprendžiamas | Kompiliavimo metu (statinis) | Vykdymo metu (dinaminis) |
| Tikslas | Patogumas / variantai | Polimorfizmas |
class Printer {
void print(String s) { System.out.println(s); }
void print(int n) { System.out.println(n); } // same name, diff param
void print(String s, int times) { /* ... */ }
}
Kompilorius pasirenka kurį print naudoti pagal argumentų tipus — jokia paveldėjimo nėra.
class Animal { String speak() { return "..."; } }
class Dog extends Animal {
@Override
String speak() { return "Woof"; } // replaces Animal.speak()
}
Animal a = new Dog();
a.speak(); // "Woof" — runtime picks Dog's version (dynamic dispatch)
Dažna klaida yra netyčia perkrauti kai turėjai tikslo perrašyti (pvz., rašybos klaida paraše). Visada naudok @Override (Java) arba override (C#), kad kompiliatorius tai sugautų.
Perrašymas yra polimorfizmo variklis — vykdymo meto mechanizmas, dėl kurio veikia "vienas sąsaja, daugybė implementacijų".
Žinoti skirtumą padeda išvengti klasikinės klaidos: manykite, kad pakeitėte elgesį, kai iš tikrųjų sukūrėte antrą, niekad neiškviestą metodą.