web-dev-qa-db-fra.com

Différence fondamentale entre langage orienté objet et langage orienté objet

Je veux savoir quelle est la différence fondamentale entre 

Langages orientés objet et basés sur les objets

J'ai lu beaucoup de post tous disent deux choses

  1. Le langage orienté objet prend en charge toutes les fonctionnalités des POO et le langage basé sur objets ne prend pas en charge toutes les fonctionnalités des POO telles que Polymorphisme et Héritage.

  2. Ils donnent des exemples de JavaScript en tant qu'objet et de Java en tant qu'objet

Aime ce post de stackoverflow

Différence entre langage orienté objet et langage à base d'objet

Mais je veux savoir quelle est la différence fondamentale entre le concept, quelle que soit la langue.

Obtenu la réponse

Enfin obtenu la chose

grâce à Matías Fidemraizer

Réponse qui ne dépend d'aucune langue, ni d'aucune fonctionnalité, la différence fondamentale pour laquelle je me penche est

Le langage qui contient lui-même des objets est appelé langage orienté objet et le langage qui suit les concepts orientés objet est appelé langage orienté objet

28
user2164685

JavaScript est un langage orienté prototype. 

Il peut construire des objets réels à partir d'une fonction constructeur et présente presque toutes les fonctionnalités que tout objet pourrait avoir:

  • Constructeur.
  • Méthodes (c'est-à-dire fonctions en JavaScript).
  • Propriétés (depuis ECMA-Script 5, "Getters/Setters").
  • Les instances.

En JavaScript, tout objet a un prototype, y compris functions. Le prototype lui-même est une manière rudimentaire d’ajouter des membres object à toute instance nouvellement créée de l’objet entier. 

var constructor = function() { };
constructor.prototype.text = "hello world";

alert(new constructor().text); // This alerts hello world

Pourquoi JavaScript n'est-il pas un langage de programmation orienté objet (script)? Parce qu’il n’a pas de fonctionnalité qui réponde aux exigences de la définition de la programmation orientée objet:

  • Polymorphisme : Non. Vous pouvez modifier le comportement d'un membre prototype, mais il ne s'agit que de réutiliser l'identifiant. Vous ne pouvez pas accéder à l'implémentation précédente du membre dans un objet pseudo-dérivé.
  • Héritage : Pas du tout. La chaîne de prototypes est peut-être comparable à l'héritage, mais JavaScript (ECMA-Script 5.x ou versions antérieures) n'a pas d'héritage basé sur la syntaxe, contrairement aux autres langages basés sur la POO (par exemple, Java, C #, Ruby, Python, VisualBasic.NET, ...). ).
  • Encapsulation . Oui, bien sûr, mais il n’ya aucun moyen de créer des membres d’objets privés ou internes réels.

J'ai peut-être oublié de mentionner un autre détail, mais honnêtement, je pense qu'il s'agit d'un bon résumé.

Mise à jour et résumé

La différence fondamentale est qu'un langage de programmation orienté objet possède les fonctionnalités qu'un paradigme orienté objet doit posséder pour être considéré comme un langage de programmation orienté objet. Ainsi, JavaScript, pour le moment, n'est pas un langage de programmation orienté objet, car il manque de polymorphisme et d'héritage.

Mise à jour: ES2015 et versions ultérieures ont-ils changé la situation?

Esthétiquement parlant, oui, ES2015 et au-dessus a une amélioration majeure qui permet de considérer une programmation pas complètement mais plus proche d’une programmation orientée objet: le sucre syntaxique d’appeler à la super classe.

Par exemple:

class A {
     doStuff() {
         console.log("hello world");
     }
}

class B extends A {
     doStuff() {
         super.doStuff();
         console.log("...and goodbye!");
     }
}

C'est polymorphism. Une classe plus spécialisée peut redéfinir sa classe de base pour modifier complètement le comportement d'une fonction ou faire ce que la base faisait déjà, en ajoutant un nouveau code à la fonction.

BTW, ES2015 et versions ultérieures n'a toujours pas la véritable encapsulation: où sont les modificateurs d'accès tels que private ou public ici? Nulle part.

Et, à la fin de la journée, ES2015 et versions ultérieures implémentent la classe OOP mais il s'agit toujours d'une couche de sucre syntaxique au-dessus de ECMAScript 5.x ... Le code ci-dessus fonctionne toujours avec des prototypes sous le capot et cela fonctionne de la même manière que si vous le codiez dans ECMAScript 5.x:

function A() {
}

A.prototype.doStuff = function() {
    console.log("hello world");
};

function B() {
}

B.prototype = Object.create(A.prototype);
B.prototype.doStuff = function() {
    A.prototype.doStuff.call(this);
    console.log("...and goodbye!");
};

Espérons que je devrai mettre à jour cette réponse à nouveau car ES2020 a déjà proposé des modificateurs d'accès et nous pourrons considérer JavaScript comme un autre langage qui prend totalement en charge la programmation orientée objet!

21

Basé sur les objets les langages incluent essentiellement tous les langages offrant la possibilité intégrée de créer et d’utiliser facilement des objets. Il y a un critère majeur:

  • Encapsulation. Les objets ont une API qui leur est attachée, généralement de sorte que vous travaillez avec l'objet plus en lui disant quoi faire qu'en exécutant une fonction sur celui-ci.

    La plupart des langages basés sur les objets définissent les objets en termes de "classes", qui sont fondamentalement des plans pour un objet. La classe présente la structure interne de l'objet et définit l'API.

    Ce n'est pas le seul moyen, cependant. En JavaScript, par exemple, les objets n'ont pas vraiment de "classes". Tout objet peut avoir toutes les propriétés qu'il souhaite. Et comme les fonctions sont des valeurs de première classe en JavaScript, elles peuvent être définies en tant que propriétés sur l'objet et servir en tant qu'API de l'objet.

En ce qui concerne les langages orientés objet mais non orientés objet, un bon exemple serait Visual Basic (pas le truc. Net; je parle de VB6 et VBA). Les classes existent, mais ne peuvent pas hériter les unes des autres.

Orienté objet les langages sont des langages basés sur les objets qui vont encore plus loin. Ils ont un support intégré pour les deux autres piliers de la POO:

  • Héritage. Les objets doivent avoir la capacité d'être (et d'être considérés comme) des spécialisations d'un autre objet. Cela signifie, par exemple, pouvoir définir "Chien" comme "Animal pouvant aboyer et ramasser des bâtons".

    Dans les langages modernes, cela prend généralement la forme de la classe class d'un objet héritant de la classe class d'un autre objet. Ce n'est pas une exigence, cependant; contrairement à ce que certaines personnes essaieront de vous dire, la définition de OOP ne nécessite aucune classe.

  • Polymorphisme. Code doit pouvoir utiliser un objet sans savoir ni se soucier de son type.

    La plupart des langages (en particulier ceux à typage statique) définissent le polymorphisme en termes de classes et d'héritage. Si vous avez une classe B qui hérite de A, le code qui requiert une référence à un A peut généralement prendre un B, mais pas une classe C qui n'est pas liée à A. Java possède également le mot clé interface, qui vous permet de définir un ensemble de comportements qu'une classe doit implémenter. Tout objet dont la classe explicitement implements X, et implémentant ainsi les fonctions définies sur l'interface X, est considéré comme une instance de type X.

     D'autres langues, comme JavaScript, vous permettent de transmettre n'importe quel objet que vous aimez. Tant que l'objet présente la bonne interface, le type d'objet importe peu. C'est ce qu'on appelle le "typage de canard", et c'est presque la forme la plus pure de polymorphisme qui existe.

16
cHao

Le simple fait d'utiliser des objets ne signifie pas que vous exécutez la POO, même dans un langage entièrement OO si vous n'implémentez pas les techniques OO, il s'agit simplement d'une programmation à base d'objets.

4
LarrySTS

grossièrement ...

  • orienté objet: prend en charge l'encapsulation, l'héritage, le polymorphisme
  • basé sur les objets: prend en charge l'encapsulation

Wikipedia - Langage basé sur les objets

0
dthal

OOP et OBP sont des types de langages de programmation qui suivent des principes différents.

OOP: suit le polymorphisme, l'héritage et l'encapsulation (PIE). 

  • Exemples : Java, .Net etc. OOP est une nouvelle comparaison avec OBP

OBP: suit le polymorphisme et l'encapsulation. 

  • Exemples : Ada, Visual Basic (VB) et Fortran 90. OBP est ancien
0
Premraj

Un langage de programmation doit se conformer à 4 éléments principaux pour être un véritable langage orienté objet. Ce sont: Abstraction, Encapsulation, Modularity & Hierarchy.

Cependant, nous pouvons appeler un objet langage si cela supporte les premiers éléments. Dès qu'un langage de programmation prend en charge le concept d'objet, il prend en charge, par nature, les trois premiers éléments, car ils constituent une caractéristique inhérente à un objet. 

En tant que langage, javascript ne peut pas être qualifié de langage orienté objet mais basé sur les objets car il ne prend pas en charge la hiérarchie (en particulier l'héritage).

0
Arnab