logo

30 questions et réponses d'entretien avec les OOP (2024)

La programmation orientée objet, ou POO, est un paradigme de programmation qui met en œuvre le concept de objets dans le programme. Il vise à fournir une solution plus simple aux problèmes du monde réel en implémentant des entités du monde réel telles que l'héritage, l'abstraction, le polymorphisme, etc. dans la programmation. Le concept de POO est largement utilisé dans de nombreux langages populaires comme Java, Python, C++, etc.

Questions et réponses d'entretien avec les OOP

Les POO sont également l'un des sujets les plus importants pour les entretiens de programmation. Cet article contient quelques principales questions d'entretien sur le concept des POO.



Questions d'entretien chez OOP

1. Qu'est-ce que la programmation orientée objet (POO) ?

Ô objet Ô rienté P. programmation (également connu sous le nom de POO) est un paradigme de programmation dans lequel le logiciel complet fonctionne comme un groupe d'objets qui communiquent entre eux. Un objet est une collection de données et les méthodes qui opèrent sur ces données.

2. Pourquoi les POO ?

Le principal avantage de la POO est un code mieux gérable qui couvre les éléments suivants :

  1. La compréhension globale du logiciel s'accroît à mesure que la distance entre le langage parlé par les développeurs et celui parlé par les utilisateurs s'accroît.
  2. L'orientation objet facilite la maintenance grâce à l'utilisation de l'encapsulation. On peut facilement modifier la représentation sous-jacente en gardant les mêmes méthodes.
  3. Le paradigme POO est principalement utile pour les logiciels relativement gros.

3. Qu'est-ce qu'une classe ?

UN classe est un élément constitutif des programmes orientés objet. Il s'agit d'un type de données défini par l'utilisateur qui contient les données membres et les fonctions membres qui opèrent sur les données membres. C'est comme un plan ou un modèle d'objets ayant des propriétés et des méthodes communes.



4. Qu'est-ce qu'un objet ?

Un objet est une instance d'une classe. Les données membres et les méthodes d’une classe ne peuvent pas être utilisées directement. Nous devons créer un objet (ou une instance) de la classe pour les utiliser. En termes simples, ce sont les véritables entités du monde qui ont un état et un comportement.

C++
#include  using namespace std; // defining class class Student { public:  string name; }; int main() {  // creating object  Student student1;  // assigning member some value  student1.name = 'Rahul';  cout << 'student1.name: ' << student1.name;  return 0; }>
Java
// class definition class Student {  String name; } class GfG {  public static void main(String args[])  {  // creating an object  Student student1 = new Student();  // assigning member some value  student1.name = 'Rahul';  System.out.println('student1.name: ' + student1.name);  } }>
Python
# class definition class Student: name = '' # creating object student1 = Student() student1.name = 'Rahul'; print('student1.name: ' + student1.name);>
C#
using System; // defining class public class Student {  public string name; } public class GFG {  static public void Main()  {  // creating object  Student student1 = new Student();  student1.name = 'Rahul';  Console.WriteLine('student1.name: ' + student1.name);  } }>

Sortir
student1.name: Rahul>

5. Quelles sont les principales caractéristiques des POO ?

Les principales caractéristiques des POO, également connues sous le nom de 4 piliers ou principes de base des POO, sont les suivantes :

  1. Encapsulation
  2. Abstraction de données
  3. Polymorphisme
  4. Héritage
piliers de oups

Principales caractéristiques des POO



6. Qu'est-ce que l'encapsulation ?

L'encapsulation est la liaison des données et des méthodes qui les manipulent en une seule unité de telle sorte que les données sensibles soient cachées aux utilisateurs.
Il est mis en œuvre selon les processus mentionnés ci-dessous :

  1. Masquage des données : Une fonctionnalité de langage pour restreindre l'accès aux membres d'un objet. Par exemple, les membres privés et protégés en C++.
  2. Regroupement des données et des méthodes : Les données et les méthodes qui fonctionnent sur ces données sont regroupées. Par exemple, les données membres et les méthodes membres qui les utilisent sont regroupées dans une seule unité appelée classe.
encapsulation

7. Qu'est-ce que l'abstraction ?

L'abstraction est similaire à l'encapsulation de données et est très importante en POO. Cela signifie afficher uniquement les informations nécessaires et cacher les autres informations non pertinentes à l’utilisateur. L'abstraction est implémentée à l'aide de classes et d'interfaces.

abstraction dans les POO

8. Qu'est-ce que le polymorphisme ?

Le mot Polymorphisme signifie avoir plusieurs formes. C'est la propriété de certains codes de se comporter différemment selon les contextes. Par exemple, en langage C++, on peut définir plusieurs fonctions ayant le même nom mais fonctionnant différemment selon le contexte.

Le polymorphisme peut être classé en deux types en fonction du moment où l'appel à l'objet ou à la fonction est résolu. Ils sont les suivants :

  • Polymorphisme au moment de la compilation
  • Polymorphisme d'exécution

A) Polymorphisme au moment de la compilation

Le polymorphisme au moment de la compilation, également connu sous le nom de polymorphisme statique ou liaison précoce, est le type de polymorphisme dans lequel la liaison de l'appel à son code est effectuée au moment de la compilation. La surcharge de méthodes ou la surcharge d'opérateurs sont des exemples de polymorphisme au moment de la compilation.

B) Polymorphisme d'exécution

Également connu sous le nom de polymorphisme dynamique ou liaison tardive, le polymorphisme d'exécution est le type de polymorphisme dans lequel l'implémentation réelle de la fonction est déterminée pendant l'exécution ou l'exécution. Le remplacement de méthode est un exemple de cette méthode.

9. Qu'est-ce que l'héritage ? Quel est son but?

L'idée de l'héritage est simple, une classe est dérivée d'une autre classe et utilise les données et l'implémentation de cette autre classe. La classe dérivée est appelée enfant ou dérivée ou sous-classe et la classe dont la classe enfant est dérivée est appelée parent ou base ou superclasse.

L’objectif principal de l’héritage est d’augmenter la réutilisabilité du code. Il est également utilisé pour réaliser le polymorphisme d’exécution.

10. Que sont les spécificateurs d'accès ? Quelle est leur importance dans les POO ?

Les spécificateurs d'accès sont des types spéciaux de mots-clés utilisés pour spécifier ou contrôler l'accessibilité d'entités telles que des classes, des méthodes, etc. Privé , Publique , et Protégé sont des exemples de spécificateurs d'accès ou de modificateurs d'accès.
Les composants clés des POO, l'encapsulation et le masquage des données, sont en grande partie réalisés grâce à ces spécificateurs d'accès.

11. Quels sont les avantages et les inconvénients des POO ?

Avantages des POO

idée complète

Inconvénients des POO

Les POO offrent une réutilisabilité améliorée du code.Le programmeur doit être compétent et avoir une excellente réflexion en termes d'objets, car tout est traité comme un objet dans les POO.
Le code est plus facile à maintenir et à mettre à jour.Une bonne planification est nécessaire car les POO sont un peu délicates.
Il offre une meilleure sécurité des données en limitant l'accès aux données et en évitant toute exposition inutile.Le concept de POO ne convient pas à toutes sortes de problèmes.
Rapide à mettre en œuvre et facile à reconcevoir, ce qui permet de minimiser la complexité d'un programme global.La durée des programmes est beaucoup plus longue que celle de l'approche procédurale.

12. Quels autres paradigmes de programmation existent en dehors des POO ?

Le paradigme de programmation fait référence à la technique ou à l'approche d'écriture d'un programme. Les paradigmes de programmation peuvent être classés dans les types suivants :

types de paradigmes de programmation

1. Paradigme de programmation impérative

Il s'agit d'un paradigme de programmation qui fonctionne en modifiant l'état du programme via des instructions d'affectation. L’accent principal de ce paradigme est sur la manière d’atteindre l’objectif. Les paradigmes de programmation suivants entrent dans cette catégorie :

  1. Paradigme de programmation procédurale : Ce paradigme de programmation est basé sur le concept d'appel de procédure. Les procédures, également appelées routines ou fonctions, sont les éléments de base d'un programme dans ce paradigme.
  2. Programmation Orientée Objet ou POO : Dans ce paradigme, nous visualisons chaque entité comme un objet et essayons de structurer le programme en fonction de l'état et du comportement de cet objet.
  3. Programmation parallèle : Le paradigme de programmation parallèle est le traitement des instructions en les divisant en plusieurs parties plus petites et en les exécutant simultanément.

2. Paradigme de programmation déclarative

La programmation déclarative se concentre sur ce qui doit être exécuté plutôt que sur la manière dont cela doit être exécuté. Dans ce paradigme, nous exprimons la logique d'un calcul sans considérer son flux de contrôle. Le paradigme déclaratif peut être classé en :

  1. Paradigme de programmation logique : Il est basé sur une logique formelle où les énoncés du programme expriment les faits et les règles concernant le problème sous une forme logique.
  2. Paradigme de programmation fonctionnelle : Les programmes sont créés en appliquant et en composant des fonctions dans ce paradigme.
  3. Paradigme de programmation de base de données : Pour gérer les données et les informations organisées sous forme de champs, d'enregistrements et de fichiers, des modèles de programmation de bases de données sont utilisés.

13. Quelle est la différence entre la programmation structurée et la programmation orientée objet ?

La programmation structurée est une technique considérée comme un précurseur de la POO et se compose généralement de modules bien structurés et séparés. C'est un sous-ensemble de la programmation procédurale. La différence entre les POO et la programmation structurée est la suivante :

Programmation orientée objet

Programmation structurelle

La programmation orientée objet repose sur des objets ayant un état et un comportement.La structure logique d’un programme est fournie par la programmation structurelle, qui divise les programmes en fonctions correspondantes.
Il suit une approche ascendante.Il suit une approche descendante.
Restreint le flux ouvert de données aux parties autorisées uniquement, offrant ainsi une meilleure sécurité des données.Aucune restriction au flux de données. N’importe qui peut accéder aux données.
Réutilisabilité améliorée du code grâce aux concepts de polymorphisme et d'héritage.La réutilisabilité du code est obtenue en utilisant des fonctions et des boucles.
En cela, les méthodes sont écrites globalement et les lignes de code sont traitées une par une, c'est-à-dire exécutées de manière séquentielle.En cela, la méthode fonctionne de manière dynamique, effectuant des appels selon les besoins du code pendant un certain temps.
La modification et la mise à jour du code sont plus faciles.Modifier le code est difficile par rapport aux POO.
Les données ont plus d'importance dans les POO.Le code reçoit plus d'importance.

14. Quels sont les langages de programmation orientés objet couramment utilisés ?

Le paradigme POO est l'un des paradigmes de programmation les plus populaires. Il est largement utilisé dans de nombreux langages de programmation populaires tels que :

15. Quels sont les différents types de polymorphisme ?

Le polymorphisme peut être classé en deux types en fonction du moment où l'appel à l'objet ou à la fonction est résolu. Ils sont les suivants :

  1. Polymorphisme au moment de la compilation
  2. Polymorphisme d'exécution
types de polymorphisme

Types de polymorphisme

A) Polymorphisme au moment de la compilation

Le polymorphisme au moment de la compilation, également connu sous le nom de polymorphisme statique ou liaison précoce, est le type de polymorphisme dans lequel la liaison de l'appel à son code est effectuée au moment de la compilation. Surcharge de méthode ou surcharge de l'opérateur sont des exemples de polymorphisme au moment de la compilation.

B) Polymorphisme d'exécution

Aussi connu sous le nom polymorphisme dynamique ou liaison tardive, le polymorphisme d'exécution est le type de polymorphisme dans lequel l'implémentation réelle de la fonction est déterminée pendant l'exécution ou l'exécution. Remplacement de méthode est un exemple de cette méthode.

16. Quelle est la différence entre la surcharge et le remplacement ?

Une fonctionnalité de polymorphisme au moment de la compilation appelée surcharge permet à une entité d'avoir de nombreuses implémentations du même nom. La surcharge de méthodes et la surcharge d’opérateurs en sont deux exemples.

Primordial est une forme de polymorphisme d'exécution dans lequel une entité portant le même nom mais une implémentation différente est exécutée. Il est implémenté à l'aide de fonctions virtuelles.

17. Y a-t-il des limitations en matière d'héritage ?

Oui, il y a plus de défis lorsque vous avez plus d'autorité. Bien que l’héritage soit une fonctionnalité très importante des POO, il présente également des inconvénients importants.

  • Comme il doit passer par plusieurs classes pour être implémenté, l’héritage est plus long à traiter.
  • La classe de base et la classe enfant, qui sont toutes deux impliquées dans l'héritage, sont également étroitement liées les unes aux autres (appelées étroitement couplées). Par conséquent, si des changements doivent être apportés, ils devront peut-être être effectués dans les deux classes en même temps.
  • La mise en œuvre de l'héritage peut également être difficile. Par conséquent, si cela n’est pas mis en œuvre correctement, cela pourrait entraîner des erreurs imprévues ou des résultats inexacts.

18. Quels sont les différents types d’héritage ?

L'héritage peut être classé en 5 types qui sont les suivants :

types d'héritage
  1. Héritage unique : Classe enfant dérivée directement de la classe de base
  2. Héritage multiple : Classe enfant dérivée de plusieurs classes de base.
  3. Héritage multiniveau : Classe enfant dérivée de la classe qui est également dérivée d'une autre classe de base.
  4. Héritage hiérarchique : Plusieurs classes enfants dérivées d’une seule classe de base.
  5. Héritage hybride : Héritage composé de plusieurs types d'héritage spécifiés ci-dessus.

Note: Le type d'héritage pris en charge dépend de la langue. Par exemple, Java ne prend pas en charge l'héritage multiple.

19. Qu'est-ce qu'une interface ?

Un type de classe unique appelé interface contient des méthodes mais pas leurs définitions. A l'intérieur d'une interface, seule la déclaration de méthode est autorisée. Vous ne pouvez pas créer d'objets à l'aide d'une interface. Au lieu de cela, vous devez utiliser cette interface et spécifier les procédures pour ce faire.

20. En quoi une classe abstraite est-elle différente d'une interface ?

Les classes abstraites et les interfaces sont des types spéciaux de classes qui incluent simplement la déclaration des méthodes, pas leur implémentation. Une classe abstraite est cependant complètement distincte d’une interface. Voici quelques différences majeures entre une classe abstraite et une interface.

Classe abstraite

Interface

Cependant, lorsqu'une classe abstraite est héritée, la sous-classe n'est pas tenue de fournir la définition de la méthode abstraite jusqu'à ce qu'elle l'utilise réellement.Lorsqu’une interface est implémentée, la sous-classe doit spécifier toutes les méthodes de l’interface ainsi que leur implémentation.
Une classe abstraite peut avoir des méthodes abstraites et non abstraites.Une interface ne peut avoir que des méthodes abstraites.
Une classe abstraite peut avoir des variables finales, non finales, statiques et non statiques.L'interface n'a que des variables statiques et finales.
La classe abstraite ne prend pas en charge l'héritage multiple.Une interface prend en charge l'héritage multiple.

21. Quelle quantité de mémoire une classe occupe-t-elle ?

Les cours n'utilisent pas de mémoire. Ils servent simplement de modèle à partir duquel les éléments sont fabriqués. Désormais, les objets initialisent réellement les membres de la classe et les méthodes lors de leur création, en utilisant la mémoire dans le processus.

22. Est-il toujours nécessaire de créer des objets à partir d’une classe ?

Non. Si la classe de base inclut des méthodes non statiques, un objet doit être construit. Mais aucun objet ne doit être généré si la classe inclut des méthodes statiques. Dans ce cas, vous pouvez utiliser le nom de la classe pour appeler directement ces méthodes statiques.

chaîne en caractère

23. Quelle est la différence entre une structure et une classe en C++ ?

La structure est également un type de données défini par l'utilisateur en C++ similaire à la classe avec les différences suivantes :

  • La différence majeure entre une structure et une classe est que dans une structure, les membres sont publics par défaut tandis que dans une classe, les membres sont privés par défaut.
  • L'autre différence est que nous utilisons structurer pour déclarer la structure et classe pour déclarer une classe en C++.

24. Qu'est-ce que le constructeur ?

Un constructeur est un bloc de code qui initialise l'objet nouvellement créé. Un constructeur ressemble à une méthode d’instance mais ce n’est pas une méthode car il n’a pas de type de retour. C'est généralement la méthode qui porte le même nom que la classe mais dans certaines langues, cela peut différer. Par exemple:

En python, un constructeur est nommé __chaud__.

En C++ et Java, le constructeur porte le même nom que le nom de la classe.

Exemple:

C++
class base {  public:  base() { cout << 'This is a constructor'; } }>
Java
class base {  base() { System.out.printIn('This is a constructor'); } }>
Python
class base: def __init__(self): print('This is a constructor')>

25. Quels sont les différents types de constructeurs en C++ ?

La classification la plus courante des constructeurs comprend :

  1. Constructeur par défaut
  2. Constructeur non paramétré
  3. Constructeur paramétré
  4. Copier le constructeur

1. Constructeur par défaut

Le constructeur par défaut est un constructeur qui ne prend aucun argument. Il s'agit d'un constructeur non paramétré qui est automatiquement défini par le compilateur lorsqu'aucune définition explicite du constructeur n'est fournie.

Il initialise les données membres à leurs valeurs par défaut.

2. Constructeur non paramétré

Il s'agit d'un constructeur défini par l'utilisateur n'ayant ni argument ni paramètre.

Exemple:

C++
class base {  base()  {  cout << 'This is a non-parameterized contructor';  } }>
Java
class base {  base()  {  System.out.printIn(  'This is a non-parameterized constructor.');  } }>
Python
class base: def __init__(self): print('This is a non-parameterized constructor')>

3. Constructeur paramétré

Les constructeurs qui acceptent certains arguments sont appelés constructeurs paramétrés.

Exemple:


C++
class base { public:  int base;  base(int var)  {  cout << 'Constructor with argument: ' << var;  } };>
Java
class base {  int base;  base(int a)  {  System.out.println('Constructor with argument: '  + a);  } }>
Python
class base: def __init__(self, a): print('Constructor with argument: {}'.format(a))>

4. Copier le constructeur

Un constructeur de copie est une fonction membre qui initialise un objet en utilisant un autre objet de la même classe.

Exemple:

C++
class base {  int a, b;  base(base& obj) // copy constructor  {  a = obj.a;  b = obj.b;  } }>
Java
class base {  int a, b;  base(base obj) // copy constructor  {  a = obj.a;  b = obj.b;  } }>


En Python, nous n'avons pas de constructeurs de copie intégrés comme Java et C++, mais nous pouvons trouver une solution de contournement en utilisant différentes méthodes.

arborescence

26. Qu'est-ce qu'un destructeur ?

Un destructeur est une méthode qui est automatiquement appelée lorsque l'objet est rendu hors de portée ou détruit.

En C++, le nom du destructeur est également le même que le nom de la classe mais avec le ( ~ ) symbole tilde comme préfixe.

En Python, le destructeur s'appelle __du__ .

Exemple:

C++
class base { public:  ~base() { cout << 'This is a destructor'; } }>
Python
class base: def __del__(self): print('This is destructor')>


En Java, le garbage collector supprime automatiquement les objets inutiles donc il n'y a pas de notion de destructeur en Java. Nous aurions pu utiliser la méthode finalize() comme solution de contournement pour le destructeur Java, mais elle est également obsolète depuis Java 9.

27. Peut-on surcharger le constructeur dans une classe ?

Oui On peut surcharger le constructeur dans une classe en Java. La surcharge du constructeur est effectuée lorsque nous voulons un constructeur avec un constructeur différent avec un paramètre différent (nombre et type).

28. Peut-on surcharger le destructeur dans une classe ?

Non. Un destructeur ne peut pas être surchargé dans une classe. Il ne peut y avoir qu'un seul destructeur présent dans une classe.

29. Quelle est la fonction virtuelle ?

Une fonction virtuelle est une fonction utilisée pour remplacer une méthode de la classe parent dans la classe dérivée. Il est utilisé pour fournir une abstraction dans une classe.

En C++, une fonction virtuelle est déclarée à l'aide du mot-clé virtual,

En Java, chaque méthode publique, non statique et non finale est une fonction virtuelle.

Les méthodes Python sont toujours virtuelles.

Exemple:

C++
class base {  virtual void print()  {  cout << 'This is a virtual function';  } }>
Java
class base {  void func()  {  System.out.printIn('This is a virtual function')  } }>
Python
class base: def func(self): print('This is a virtual function')>

30. Qu'est-ce qu'une fonction virtuelle pure ?

Une fonction virtuelle pure, également appelée fonction abstraite, est une fonction membre qui ne contient aucune instruction. Cette fonction est définie dans la classe dérivée si nécessaire.

Exemple:

C++
class base {  virtual void pureVirFunc() = 0; }>
Java
abstract class base {  abstract void prVirFunc(); }>


En Python, nous y parvenons en utilisant @abstractmethod du module ABC (Abstract Base Class).

Question bonus

Qu'est-ce qu'une classe abstraite?

En termes généraux, une classe abstraite est une classe destinée à être utilisée pour l'héritage. Il ne peut pas être instancié. Une classe abstraite peut être composée de méthodes abstraites et non abstraites.

En C++, une classe abstraite est une classe qui contient au moins une fonction virtuelle pure.

En Java, une classe abstraite est déclarée avec un abstrait mot-clé.

Exemple:

C++
class absClass { public:  virtual void pvFunc() = 0; }>
Java
abstract class absClass {  // body }>


En Python, nous utilisons le module ABC (Abstract Base Class) pour créer une classe abstraite.

Doit se référer :

  1. POO en C++
  2. POO en Java
  3. POO en Python
  4. Classes et objets en C++
  5. Classes et objets en Java
  6. Classes et objets en Python
  7. Introduction aux paradigmes de programmation
  8. Interface en Java
  9. Classe abstraite en Java
  10. Questions d'entretien C++