Begge genbruger en metode , men de er fundamentalt forskellige. = samme navn, , i samme klasse, løst på . = en subklasse en forældremetode med , løst på .
Begge genbruger en metode , men de er fundamentalt forskellige. = samme navn, , i samme klasse, løst på . = en subklasse en forældremetode med , løst på .
| Overbygning | Tilsidesættelse | |
|---|---|---|
| Signatur | Skal være forskellig (parametrer) | Skal være identisk |
| Forhold | Samme klasse | Forældreklasse ↔ subklasse |
| Løst | Kompileringstidspunkt (static) | Kørselstidspunkt (dynamic) |
| Formål | Bekvemmelighed / varianter | Polymorfisme |
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) { /* ... */ }
}
Kompilatoren vælger hvilken print baseret på argumenttyper — ingen arv involveret.
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)
En hyppig fejl er utilsigtet overbygning når du ville tilsidesætte (f.eks. en stavefejl i signaturen). Brug altid @Override (Java) eller override (C#) så kompilatoren kan fange det.
Tilsidesættelse er motorern til polymorfisme — den kørselstidsmekkanisme, der får "et interface, mange implementeringer" til at fungere.
At kende forskel forhindrer en klassisk fejl: at tro du erstattede adfærd når du faktisk oprettede en anden metode der aldrig bliver kaldt.