Overerving (Inheritance)¶
De manier om dit principe naar OOP te vertalen noemen we Overerving (Inheritance). Overerving helpt bij het hergebruiken van code en het organiseren van objecten. Met Overerving kunnen we bijvoorbeeld een basis-class(parent) Voertuig
creëren met algemene eigenschappen, zoals het aantal wielen en de maximale snelheid. Afgeleide classes zoals Auto
, Vrachtwagen
en Motorfiets
erven deze eigenschappen en voegen specifieke kenmerken toe, zoals het aantal deuren en het laadvermogen. Dit bevordert een efficiënte en gestructureerde code, waarbij we gemeenschappelijke functionaliteit op één plek neerzetten en specifieke functionaliteit toevoegen in subclasses (child-classes).
Overerving maakt het onderhouden en uitbreiden van de code gemakkelijker, waardoor we flexibele en herbruikbare code kunnen schrijven, zoals in dit voorbeeld het modelleren van auto’s en andere voertuigen.
classDiagram
Voertuig <|-- Auto
Voertuig <|-- Vrachtwagen
Voertuig <|-- Motorfiets
Voertuig : -String merknaam
Voertuig : -int aantalWielen
Voertuig : -int maximaleSnelheid
Voertuig : getMerknaam()
class Auto{
-int aantalDeuren
-boolean heeftDakdragers
getAantalDeuren()
}
class Vrachtwagen{
-int laadvermogen
-boolean heeftSlaapcabine
getLaadvermogen()
}
class Motorfiets{
-int aantalCC
-boolean heeftZijspan
getAantalCC()
}
Voorbeelden van Overerving in TypeScript en Python:
/**
* Musician super-class (or parent-class)
*/
class Musician {
public artistName: string;
public bandName: string;
public bankAccount: string;
public constructor(
artistName: string,
bandName: string,
bankAccount: string
) {
this.artistName = artistName;
this.bandName = bandName;
this.bankAccount = bankAccount;
}
public logBandName() {
console.log("The band name is ", this.bandName);
}
}
/**
* Guitarist sub-class (or child-class)
*/
class Guitarist extends Musician {
public logBankAccount() {
console.log("The bank account is ", this.bankAccount);
}
}
/**
* Drummer sub-class (or child-class)
*/
class Drummer extends Musician {
play() {
console.log("Drummer is drumming.");
}
stop() {
console.log("Drummer stops drumming.");
}
}
const guitarist: Guitarist = new Guitarist(
"Dan Auerbach",
"The Black Keys",
"ASNB123456790"
);
console.log(guitarist.logBandName());
// this will log the bandname 'The Black Keys'
console.log(guitarist.logBankAccount());
// this will log the bankaccount 'ASNB123456790'
const drummer: Drummer = new Drummer(
"Ringo Starr",
"The Beatles",
"ASNB987654321"
)
console.log(drummer.logBandName());
// this will log the bandname 'The Beatles'
console.log(drummer.play());
// this will log 'Drummer is drumming'
# super-class (or parent-class)
class Musician:
def __init__(self, artistName, instrumentName):
self.artistName = artistName
self.instrumentName = instrumentName
def start(self):
print(self.artistName + " starts playing a " + self.instrumentName)
def stop(self):
print(self.artistName + " stops playing on the " + self.instrumentName)
# sub-class (or child-class)
class Guitarist(Musician):
def __init__(self, artistName):
# pass the artistName and instrumentName variables to the super-class via the 'super' function
super().__init__(artistName, "guitar")
# guitarist class specific method
def playSolo(self):
print(self.artistName + " plays a solo!")
# sub-class (or child-class)
class Drummer(Musician):
def __init__(self, artistName):
# pass the artistName and instrumentName variables to the super-class via the 'super' function
super().__init__(artistName, "drums")
# guitarist class specific method
def drumRoll(self):
print(self.artistName + " plays a drum roll!")
musician = Musician("Ray Manzarek", "🎹 keyboard")
musician.start()
guitarist = Guitarist("John Mayer")
guitarist.start()
# prints the guitarist's name and the playSolo message
guitarist.playSolo()
drummer = Drummer("Ringo Starr")
drummer.start()
# prints the drummer's name and the drumRoll message
drummer.drumRoll()
musician.stop()
guitarist.stop()
drummer.stop()