Kuris metodas objektinio programavimo metu nėra galima perrašyti?
sobes.tech AI
Atsakymas iš AI
Kai kuriose kalbose, pavyzdžiui, Ruby, klasės initialize metodas, naudojamas naujų objektų inicijavimui, negali būti tiesiogiai iškviečiamas vaikų klasėje kaip super.initialize, kad būtų vykdoma tėvų klasės logika. Vietoj to, vaiko klasė turi savo initialize realizacijoje aiškiai iškviesti super metodą, kuris automatiškai iškvies tėvų klasės initialize metodą.
Kituose kalbose, pavyzdžiui, Java ar C#, nėra "neperrašomų" vartotojo metodų tokiu pačiu būdu, kad bet kuris viešas ar apsaugotas (!) metodas, kuris nėra pažymėtas kaip final (Java) ar sealed (C#), gali būti perrašytas. Tačiau galima manyti, kad konstruktoriai yra ypatingas "metodo" tipas, kurio perrašyti neįmanoma įprastu būdu - negalima deklaruoti metodo su tuo pačiu pavadinimu ir signaturos vaikų klasėje, kuris pakeistų tėvų konstruktorių. Vaiko klasė gali turėti savo konstruktorius, kurie savo ruožtu iškviečia tėvų konstruktorius per super (Java) arba : base (C#).
class Parent {
Parent() {
System.out.println("Tėvų konstruktorius");
}
void method() {
System.out.println("Tėvų metodas");
}
}
class Child extends Parent {
Child() {
// Tiesioginis tėvų konstruktoriaus iškvietimas nereikalingas,
// jei nėra parametrų - jis iškviečiamas automatiškai.
System.out.println("Vaiko konstruktorius");
}
@Override // Metodas gali būti perrašytas
void method() {
System.out.println("Vaiko metodas");
}
}
Taigi, bendruoju atveju, konstruktorius galima laikyti metodu, kurio perrašyti neįmanoma taip pat, kaip ir įprastus metodus.