Ereditare classi nidificate - 1

"Ciao, Amico!"

"Ciao Kim."

"Voglio parlarti dell'ereditarietà di classi nidificate statiche e non statiche."

"Sono pronto."

"Non ci sono davvero problemi con l'ereditarietà di classi nidificate statiche. Vengono ereditate proprio come le classi normali:"

Esempio
public class Car
{
 public static class Door
 {

 }
}

public class LamborghiniDoor extends Car.Door
{
}

"Ma possiamo fare in modo che le classi nidificate statiche ereditino classi nidificate statiche in altre classi?"

"Perché no?"

Esempio
public class Car
{
 public static class Door
 {

 }
}

public class Lamborghini extends Car
{
 public static class LamborghiniDoor extends Car.Door
 {
 }
}

"OK, capito. Sono ereditati proprio come le classi normali, giusto?"

"Sì. Ma le classi nidificate non statiche (note come classi interne) non vengono ereditate così facilmente."

"Quando viene creata un'istanza di una classe interna, un riferimento alla sua classe esterna viene archiviato e passato implicitamente al costruttore."

"Di conseguenza, quando crei oggetti di una classe che eredita una classe interna, devi passare esplicitamente l'oggetto esterno richiesto."

"Ecco come appare:"

Codice
public class Car
{
 public class Door
 {

 }
}

public class LamborghiniDoor extends Car.Door
{
 LamborghiniDoor(Car car)
 {
  car.super();
 }
}

"Devi passare implicitamente un oggetto Car al costruttore Door. Questo viene fatto usando un costrutto speciale: «car.super()»."

"A proposito, se provi a creare il costruttore LamborghiniDoor senza alcun parametro, il programma semplicemente non si compila. Un po' strano, eh?"

"Sì, ci sono un paio di sfumature, ma non è scienza missilistica."