ორივე ხელახლა იყენებს მეთოდის , მაგრამ ისინი ფუნდამენტურად განსხვავებული არიან. = ერთი სახელი, , ერთი კლასში, გადაჭრილი . = ქვეკლასი მშობელი მეთოდს , გადაჭრილი .
ორივე ხელახლა იყენებს მეთოდის , მაგრამ ისინი ფუნდამენტურად განსხვავებული არიან. = ერთი სახელი, , ერთი კლასში, გადაჭრილი . = ქვეკლასი მშობელი მეთოდს , გადაჭრილი .
| ოვერლოდირება | ოვერრაიდირება | |
|---|---|---|
| ხელმოწერა | უნდა იყოს განსხვავებული (პარამეტრები) | უნდა იყოს იდენტური |
| ურთიერთობა | ერთი კლასი | მშობელი ↔ ქვეკლასი |
| გადაჭრა | კომპილაციის დროს (სტატიკური) | გაშვების დროს (დინამიკური) |
| მიზანი | მოხერხოებულობა / ვარიანტები | პოლიმორფიზმი |
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) { /* ... */ }
}
კომპილატორი ირჩევს რომელი print გამოიყენოს არგუმენტების ტიპების მიხედვით — მემკვიდრეობა არ ჩის.
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)
ხშირი შეცდომა არის ქმედითი ოვერლოდირება როდესაც თქვენ გამიზნული იყო ოვერრაიდირება (მაგ. შეცდომა ხელმოწერაში). ყოველთვის გამოიყენეთ @Override (Java) ან override (C#), რათა კომპილატორმა ის გაიჭირა.
ოვერრაიდირება არის პოლიმორფიზმის ძრავა — გაშვების დროის მექანიზმი, რომელიც "ერთი ინტერფეისი, მრავალი განხორციელება" მუშაობს.
ამ განსხვავების ცოდნა თავიდან აცილებს კლასიკურ ხარვეზს: დაფიქრება, რომ დანიშვულება შენი აიცვალა როდესაც სინამდვილეში შენ მეორე, არასდროს გამოძებილი მეთოდი შენი.