SOFTWARE > Linguaggi di programmazione e scripting

Richiamo dei costruttori della superclasse

(1/2) > >>

clros:
Ciao a tutti,

considerate il seguente codice:


--- Codice: ---class A : public B
{
 public:
 //costruttore
 A();
 //distruttore
 ~A();
};

A::A()
{
 cout<<sono nel costruttore!"<<endl;
}
--- Termina codice ---

Ecco, vorrei sapere se, nell'esempio di sopra, il costruttore di A, richiama esplicitamente il costruttore (vuoto o senza argomenti) di B.
Mi sembra che questo sia il comportamento normale (almeno in Java dovrebbe essere così)...
A questo punto mi interesserebbe richiamare il costruttore di B esplicitamente e NON come prima operazione da effettuarsi nel costruttore di A. Vorrei poter fare qualcosa del genere:


--- Codice: ---A::A()
{
 [Operazioni varie di inizializzazione]
 B();
}
--- Termina codice ---

Che io sappia in Java questo non si può fare (il costruttore della superclasse deve essere invocato come prima operazione nel costruttore della classe figlia), mi chiedo se invece è possibile in C++ ...

clros:

--- Citazione da: "dsar" ---Ti sconsiglio di utilizzare le supercall, perché causano il Fragile Base Class problem.
Ti consiglio invece di utilizzare le relazioni di subtyping e non subclassing.
--- Termina citazione ---

Uhmm vediamo se ho capito.
Praticamenete non mi conviene subclassare B ma creare una oggetto di classe B all'interno di A. (Fare in modo che A contenga B)

Giusto?

clros:

--- Citazione da: "dsar" ---
--- Citazione da: "clros" ---
--- Citazione da: "dsar" ---Ti sconsiglio di utilizzare le supercall, perché causano il Fragile Base Class problem.
Ti consiglio invece di utilizzare le relazioni di subtyping e non subclassing.
--- Termina citazione ---

Uhmm vediamo se ho capito.
Praticamenete non mi conviene subclassare B ma creare una oggetto di classe B all'interno di A. (Fare in modo che A contenga B)

Giusto?
--- Termina citazione ---
No, quella è la relazione HAS di containment, ed è effettivamente l'unico modo safe per avere il code reuse (tramite il delegation). Quindi tu devi per forza riutilizzare il codice?
Prima stabilisci se la relazione delle tue classi è un IS o un HAS.
--- Termina citazione ---

In realtà io vorrei che la mia (sub)classe A esponga la stessa interfaccia di B (più eventuali altri metodi definiti in A), quindi credo che che sia una relazione IS.

TheKaneB:
Per chiamare il costruttore di una superclasse, in C++, devi usare gli inizializzatori di istanza:


--- Codice: ---Figlio::Figlio()
 : Padre()
{
 // resto del costruttore

}

--- Termina codice ---

Gli inizializzatori di istanza partono prima del costruttore, quindi quella cosa che chiedi non si può fare in un punto qualsiasi del codice.

Piuttosto, potresti spostare il codice di inizializzazione in una funzione privata init(); così puoi fare:

--- Codice: ---Figlio::Figlio()
{
  init();
}

Padre::Padre()
{
  init();
}

Padre::init()
{
  // codice padre
}

Figlio::init()
{
// codice figlio #1
Padre::init();
// codice figlio #2
}


--- Termina codice ---

Non ci sono altri modi

clros:

--- Citazione da: "dsar" ---
--- Citazione da: "clros" ---In realtà io vorrei che la mia (sub)classe A esponga la stessa interfaccia di B (più eventuali altri metodi definiti in A), quindi credo che che sia una relazione IS.
--- Termina citazione ---

Se dici "esponga la stessa interfaccia" allora parliamo di subtyping che non prevede subclassing (ovvero il code reuse), quindi non puoi fare una supercall.

La relazioni tra classi devono avvenire solo tramite interfacce, la baseclass o specializzazioni di quest'ultima devono essere sempre di tipo astratto, solo la classe finale deve essere concreta.

--- Termina citazione ---

Nel mio caso non è possibile, la superclasse è una classe concreta...

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa