Une question pour les experts de la POO. - page 35

 
Реter Konow:

Comment établir des liens croisés entre des classes descendantes ayant une racine commune quelque part dans la hiérarchie ?

Par exemple : La classe F et la classe Z sont les maillons terminaux d'une chaîne d'héritage avec une racine commune dans la hiérarchie, la classe A.

Comment peut-on obtenir des données ou des méthodes de la classe Z à partir de la classe F ?

Tu ne peux pas. Il n'y a rien de tel. Mais ce n'est pas nécessaire.

Après avoir créé des objets, vous pouvez passer un pointeur d'un objet au second et un pointeur du second objet au premier.

Cependant, si nous parlons spécifiquement de la classe, vous pouvez vous adresser à n'importe quel objet en utilisant deux deux-points. Mais pourquoi en avez-vous besoin ? Elle est parfois nécessaire, bien sûr, mais il s'agit d'une fonctionnalité OOP extrêmement mineure.

 
Dmitry Fedoseev:

Pas du tout. Il n'y a rien de tel. Mais vous n'en avez pas besoin.

Après avoir créé des objets, vous pouvez passer un pointeur d'un objet au second et un pointeur du second au premier.

Cependant, si nous parlons spécifiquement de la classe, vous pouvez faire référence à n'importe quoi en utilisant deux deux-points. Mais pourquoi en avez-vous besoin ?

Tout dépend des tâches que la classe F résout. Il peut y avoir une situation où les données ou les méthodes utilisées dans une chaîne d'héritage tierce peuvent s'avérer utiles.
 

Exemple : La classe F stocke les méthodes de couleur et de longueur, et la classe Z stocke les méthodes de son et de largeur.

Un objet apparaît qui possède deux propriétés, la longueur et la largeur, mais elles sont calculées par des classes F et Z différentes. Que faire ? Créer une classe séparée avec la répétition de ces méthodes, ou comment y accéder ? (Avec un quatre points ?).

 
Реter Konow:

Exemple : La classe F stocke les méthodes de couleur et de longueur, et la classe Z stocke les méthodes de son et de largeur.

Un objet apparaît qui possède deux propriétés, la longueur et la largeur, mais elles sont calculées par des classes F et Z différentes. Que faire ? Créer une classe séparée avec la répétition de ces méthodes, ou comment y accéder ? (Avec un quatre points ?).

Vous pourriez créer une nouvelle classe et y inclure les classes F et Z.

class F{
};

class Z{
};

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

Vous pouvez créer une nouvelle classe et y inclure les classes F et Z.

Un cours d'archet ? Je l'ai. Merci.
 
Dmitry Fedoseev:

Vous pouvez créer une nouvelle classe et y inclure les classes F et Z.

Vous pouvez aussi créer une méthode dans la classe où vous voulez que les données de l'autre classe obtiennent un pointeur vers la classe requise.

 
Реter Konow:
Un "arc" de classe ? Je l'ai. Merci.

Vous pouvez simplement obtenir un pointeur vers la classe que vous voulez, et utiliser le pointeur pour obtenir un objet de classe. Mais vous devez faire attention à ne pas obtenir un pointeur vers un objet de classe vide ou nouveau.

 
Artyom Trishkin:

Vous pouvez simplement obtenir un pointeur vers la classe souhaitée, et utiliser ce pointeur pour obtenir un objet de classe. Mais vous devez faire attention à ne pas obtenir un pointeur vers un objet de classe vide.

Subtilités. Je vois. La hiérarchie de l'héritage est pratique lorsque les données sont clairement classables, prédéfinies et sans ambiguïté. À mesure que les objets deviennent plus complexes, des combinaisons de méthodes et de propriétés non prévues dans les classes peuvent apparaître, ce qui nécessite la construction de "bindings", c'est-à-dire de liens transversaux entre les classes. Cela n'est pas toujours pratique et peut briser le bon schéma de distribution et obliger à une révision.
 
Реter Konow:
Un cours de "bowing" ? Je vois, merci.

Dans l'exemple

class F{
};

class Z{
};

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

La classe Y contient des variables dont les types relèvent des classes F et Z.

Mais si vous avez déjà des objets de classes F et Z créés et utilisés quelque part, vous ne pourrez pas y accéder dans l'objet Y. Il y aura deux nouveaux objets de classes F et Z dans l'objet Y.

Et pour avoir accès aux objets des classes F et Z créés précédemment et déjà utilisés, il faut obtenir des références aux objets F et Z dans la classe Y - alors la classe Y peut opérer avec ces données, qui sont déjà écrites dans F et Z, au lieu d'utiliser de nouveaux F et Z vierges.

Mais si vous créez un tel objet, alors F et Z en lui donneront accès aux classes F et Z, et vous devez les remplir uniquement via la classe Y - encore une fois, donnez accès aux objets F et Z à partir de lui, obtenez un pointeur vers l'objet dont vous avez besoin et travaillez avec lui par le pointeur.

 
Реter Konow:
Subtilités. Je vois. La hiérarchie d'héritage est pratique lorsque les données sont clairement classables, prédéfinies et sans ambiguïté. Au fur et à mesure que les objets deviennent plus complexes, des combinaisons de méthodes et de propriétés non prévues pour les classes peuvent apparaître, ce qui nécessite la création de "bindings", c'est-à-dire de liens croisés entre les classes. Cela n'est pas toujours pratique et peut briser le beau schéma de distribution et obliger à le réviser.

Vous n'avez pas besoin de casser quoi que ce soit - il suffit d'ajouter une méthode à la classe qui donne un pointeur vers l'objet requis d'une autre classe.

Dans les articles récents, j'ai passé de cette manière des pointeurs vers desobjets de classe de collecte de données précédemment créés et fonctionnant et ayant accumulé des données et l'objet de compte courant dans les objets de commerce. Et la classe commerciale les traite comme si elle les avait toujours eus.