Čo je dedičstvo a polymorfizmus v referenčných typoch údajov?
sobes.tech AI
Odpoveď od AI
Dedívanie je mechanizmus, ktorý umožňuje novému triede (dedičovi, podtriede, podtriede) dediť polia a metódy existujúcej triedy (rodičovskej triedy, supertriedy). To podporuje opakované použitie kódu a hierarchiu tried.
Polymorfizmus (mnohotvarosť) je schopnosť objektu mať niekoľko tvarov. V kontexte referenčných typov dát to znamená, že premenná nadtriedy môže odkazovať na objekt podtriedy. To umožňuje spracovávať objekty rôznych podtried jednotným spôsobom cez spoločné rozhranie alebo nadtriedu.
Existujú dva hlavné typy polymorfizmu:
- Čas kompilácie (statický polymorfizmus): Obvykle sa dosahuje pomocou preťaženia metód (method overloading), keď v jednej triede je niekoľko metód so rovnakým menom, ale rôznymi signatúrami (počet a/alebo typy parametrov).
- Čas behu (dynamický polymorfizmus): Dosahuje sa pomocou prepísania metód (method overriding), keď podtrieda poskytne svoju implementáciu metódy, už definovanej v nadtriede. Pri volaní takejto metódy cez odkaz na nadtriedu bude vykonaná implementácia podtriedy (ak je typ objektu podtrieda).
Príklad dedičnosti a dynamického polymorfizmu:
// Základná trieda
class Animal {
public void makeSound() {
System.out.println("Obecný zvuk zvieraťa");
}
}
// Trieda-dedič
class Dog extends Animal {
@Override // Prepisovanie metódy
public void makeSound() {
System.out.println("Haf!");
}
}
// Trieda-dedič
class Cat extends Animal {
@Override // Prepisovanie metódy
public void makeSound() {
System.out.println("Mňau!");
}
}
public class Main {
public static void main(String[] args) {
// Statický typ premennej Animal, dynamický typ objektu Dog
Animal myDog = new Dog();
// Statický typ premennej Animal, dynamický typ objektu Cat
Animal myCat = new Cat();
// Statický typ premennej Animal, dynamický typ objektu Animal
Animal genericAnimal = new Animal();
// Demonstrácia polymorfizmu
myDog.makeSound(); // Zavolá metódu z Dog
myCat.makeSound(); // Zavolá metódu z Cat
genericAnimal.makeSound(); // Zavolá metódu z Animal
}
}
V tomto príklade Dog a Cat dedičia od Animal. Premenné myDog, myCat a genericAnimal majú statický typ Animal, ale odkazujú na objekty rôznych dynamických typov (Dog, Cat, Animal). Pri volaní metódy makeSound(), v každom odkaze sa vykoná príslušná implementácia metódy v závislosti od dynamického typu objektu, čo je polymorfizmus času behu.