Una domanda per gli esperti di OOP. - pagina 35

 
Реter Konow:

Come vengono stabiliti i collegamenti incrociati tra classi discendenti con una radice comune da qualche parte in profondità nella gerarchia?

Per esempio: La classe F e la classe Z sono gli anelli finali di una catena di eredità con una radice comune nella gerarchia, la classe A.

Come si possono ottenere dati o metodi della classe Z dalla classe F?

Non si può. Non esiste una cosa del genere. Ma non ce n'è bisogno.

Dopo aver creato gli oggetti potete passare un puntatore da un oggetto al secondo e un puntatore dal secondo oggetto al primo.

Anche se, se stiamo parlando specificamente della classe, è possibile indirizzare qualsiasi oggetto attraverso due punti. Ma a cosa vi serve? A volte è necessario, naturalmente, ma è una caratteristica OOP estremamente minore.

 
Dmitry Fedoseev:

Assolutamente no. Non esiste una cosa del genere. Ma non è necessario.

Dopo aver creato gli oggetti, potete passare un puntatore di un oggetto al secondo e un puntatore del secondo al primo.

Anche se, se stiamo parlando specificamente della classe, si può fare riferimento a qualsiasi cosa attraverso due punti. Ma a cosa vi serve?

Tutto dipende dai compiti che la classe F sta risolvendo. Ci può essere una situazione in cui i dati o i metodi usati in una catena di eredità di terzi possono essere utili.
 

Esempio: La classe F memorizza i metodi Colour e Length, mentre la classe Z memorizza i metodi Sound e Width.

Appare un oggetto che ha due proprietà, Lunghezza e Larghezza, ma sono calcolate da classi F e Z diverse. Cosa fare? Creare una classe separata con la ripetizione di questi metodi, o come accedervi? (Con quattro punti?).

 
Реter Konow:

Esempio: La classe F memorizza i metodi Colour e Length, mentre la classe Z memorizza i metodi Sound e Width.

Appare un oggetto che ha due proprietà, Lunghezza e Larghezza, ma sono calcolate da classi F e Z diverse. Cosa fare? Creare una classe separata con la ripetizione di questi metodi, o come accedervi? (Con quattro punti?).

Si potrebbe creare una nuova classe e includervi le classi F e Z.

class F{
};

class Z{
};

class Y{
   public:
   F f;
   Z z;
}
 
Dmitry Fedoseev:

Potete creare una nuova classe e includervi le classi F e Z.

Un corso di inchino? Capito, grazie.
 
Dmitry Fedoseev:

Potete creare una nuova classe e includervi le classi F e Z.

Oppure potete fare un metodo nella classe in cui volete i dati dell'altra classe per ottenere un puntatore alla classe richiesta.

 
Реter Konow:
Un "arco" di classe? Capito, grazie.

Potete semplicemente ottenere un puntatore alla classe che volete, e usare il puntatore per ottenere un oggetto classe. Ma bisogna fare attenzione a non ottenere un puntatore a un oggetto di classe vuoto o nuovo.

 
Artyom Trishkin:

Potete semplicemente ottenere un puntatore alla classe desiderata e usare il puntatore per ottenere un oggetto classe. Ma bisogna fare attenzione a non ottenere un puntatore a un oggetto di classe vuoto.

Sottigliezze. Capisco. La gerarchia dell'eredità è conveniente quando i dati sono chiaramente classificabili, predefiniti e non ambigui. Man mano che gli oggetti diventano più complessi, possono apparire combinazioni di metodi e proprietà non previste nelle classi, il che richiede la costruzione di "legami", cioè collegamenti incrociati tra le classi. Questo non è sempre conveniente e può rompere il simpatico schema di distribuzione e forzare una revisione.
 
Реter Konow:
Un corso di "inchino"? Capisco, grazie.

Nell'esempio

class F{
};

class Z{
};

class Y{
   public:
   F f;
   Z z;
}

La classe Y contiene variabili con tipi di classi F e Z.

Ma se avete già oggetti delle classi F e Z creati e usati da qualche parte, non potrete accedervi nell'oggetto Y. Ci saranno due nuovi oggetti di classe F e Z nell'oggetto Y.

E per avere accesso agli oggetti delle classi F e Z creati in precedenza e già utilizzati, è necessario ottenere riferimenti agli oggetti F e Z nella classe Y - poi la classe Y può operare con quei dati, che sono già scritti in F e Z, invece di utilizzare nuovi e incontaminati F e Z.

Ma se create un tale oggetto, allora F e Z in esso daranno accesso alle classi F e Z, e dovete riempirle solo tramite la classe Y - di nuovo, date accesso agli oggetti F e Z da esso, ottenete un puntatore all'oggetto che vi serve e lavorate con esso tramite il puntatore.

 
Реter Konow:
Sottigliezze. Capisco. La gerarchia dell'eredità è conveniente quando i dati sono chiaramente classificabili, predefiniti e non ambigui. Man mano che gli oggetti diventano più complessi, possono apparire combinazioni di metodi e proprietà non destinati alle classi e questo richiede la costruzione di "legami", cioè collegamenti incrociati tra le classi. Questo non è sempre conveniente e può rompere il bellissimo schema di distribuzione e costringerlo ad essere rivisto.

Non c'è bisogno di rompere nulla - basta aggiungere un metodo alla classe che dia un puntatore all'oggetto richiesto di un'altra classe.

Nei recenti articoli ho passato in questo modo i puntatori aglioggetti già creati e funzionantidella classe symbol collection e l'oggetto del conto corrente, che hanno già accumulato dati, in oggetti trade. E la classe commerciale li gestisce come se li avesse sempre avuti.