Quelle est la différence entre un objet et un struct dans la programmation orientée objet?
- Ce qui distingue et objet à partir d'une struct?
- Quand et pourquoi utiliser un objet, par opposition à une structure?
- Comment fonctionne un tableau diffèrent à la fois, et quand et pourquoi utiliser un tableau, par opposition à un objet ou d'une structure (struct)?
Je voudrais avoir une idée de ce que chacun est destiné.
- Cette question est décidément pas indépendant de la langue. Beaucoup de langues n'ont pas de notion de "struct".
- Je ne pense pas que c'est un langage indépendant de la question, car autant que je sache, "struct" n'est pas indépendant de la langue de programmation orientée objet concept. Si il ya une telle chose comme un "struct" (il n'existe pas en Java), puis la différence d'un objet dépend de la langue: vous n'obtenez pas la même réponse en C++ comme en C#, par exemple.
- Ignacio et Steve, j'ai édité la question afin de refléter vos commentaires.
Vous devez vous connecter pour publier un commentaire.
Évidemment, vous pouvez brouiller les distinctions en fonction de votre style de programmation, mais en général, une structure est structurée de l'élément de données. Un objet est une entité souveraine qui peut effectuer une tâche. Dans la plupart des systèmes, les objets ont certains de l'état et, en conséquence, avoir quelques données structurées derrière eux. Toutefois, une des principales fonctions de la classe de données est cachée et exactement comment une classe réalise tout ce qu'il ne est opaque et sans intérêt.
Étant donné que les classes peuvent être utilisées pour représenter classique structures de données telles que des tableaux, des cartes de hachage, arbres, etc, vous voient souvent les choses individuelles au sein d'un bloc de données structurées.
Un tableau est un bloc de données non structurées. Dans de nombreux langages de programmation, de toute chose dans un tableau doivent être du même type de base (comme chacun étant un nombre entier, chacun étant une chaîne, ou similaire), mais ce n'est pas vrai dans de nombreuses autres langues.
De lignes directrices:
La finalité implicite d'un objet est donc directement à associer les tâches avec les données sur lesquelles ils peuvent fonctionner et le regroupement que tous ensemble, de sorte qu'aucune autre partie du système peuvent interférer. Obéissant à bon principes de conception orientée objet peut exiger la discipline au début, mais sera finalement massivement améliorer votre code de la structure et donc votre capacité à lutter contre les grands projets et à travailler avec les autres.
Généralement, objets d'apporter l'intégralité de l'objet fonctionnalité orientée (méthodes, des données, des fonctions virtuelles, l'héritage, etc, etc) alors que les structures sont vient d'être organisée à la mémoire. Les structures peuvent ou peuvent ne pas avoir de support pour les méthodes /fonctions, mais généralement, ils ne supportent pas de l'héritage et d'autres caractéristiques de la programmation orientée objet.
Notez que j'ai dit généralement ... langues individuels sont libres de surcharge de terminologie mais ils veulent.
Tableaux n'ont rien à voir avec OO. En effet, à peu près toutes les langues autour des tableaux. Les tableaux sont à quelques blocs de la mémoire, contenant une série d'articles similaires, généralement indexables en quelque sorte.
Il n'y a pas de notion de "struct", en programmation orientée objet. La définition de structures dépend de la langue utilisée. Par exemple dans des classes C++ et les structures sont les mêmes, mais les membres de la classe sont privés par défaut, tandis que les membres de la structure sont publics pour maintenir la compatibilité avec C des structures. En C# d'autre part, struct est utilisé pour créer des types de valeur tandis que la catégorie est pour les types référence. C a structs et n'est pas orienté objet.
Encore cela dépend de la langue utilisée. Normalement, les structures sont utilisées pour représenter les Pod (Plain Old Données), ce qui signifie qu'ils ne spécifiez pas de comportement qui agit sur les données et sont principalement utilisés pour représenter des dossiers et non des objets. Ce n'est qu'une convention et n'est pas appliquée en C++.
et quand et pourquoi devrions-nous utiliser une
tableau par opposition à un objet ou à un
struct?
Un tableau est très différent. Un tableau est normalement homogène collection d'éléments indexés par un nombre entier. Une structure est un ensemble hétérogène où les éléments sont accessibles par leur nom. Il vous suffit d'utiliser un tableau pour représenter une collection d'objets de même type (un tableau de couleurs par exemple) alors que vous pouvez utiliser une structure pour représenter un enregistrement contenant des données pour un certain objet (une couleur unique qui est dans le rouge, le vert et le bleu éléments)
Point
) avec du ruban adhésif de sorte qu'ils peuvent être passés comme une unité lors de la pratique, mais de conserver leur sémantique de l'indépendance. 100-élément de tableau de structureSystem.Drawing.Point
, par exemple, est un condensé de 200int
: 100 pourX
et 100 pourY
. siPoint
avait été une classe, un tel tableau pourrait encapsuler n'importe où de 0 à 200int
valeurs.Réponse courte: les Structures sont des types de valeur. Classes(Objets) sont des types référence.
De par leur nature, un objet a des méthodes, une structure qui ne fonctionne pas.
(rien ne vous empêche d'avoir un objet sans méthodes, de jus que rien ne vous empêche, par exemple, de stocker un entier dans un flotteur de type de variable)
Les tableaux sont collection ordonnée d'éléments (en général) sont du même type. Articles peuvent être accédés par l'index. Classique tableaux permettent entier indices, pourtant langues modernes offrent souvent appelé tableaux associatifs (dictionnaires, hache, etc.) qui permettent de l'utiliser par exemple les chaînes de caractères comme des indices.
Structure est un ensemble de valeurs nommées (champs) qui peuvent être de différents types (par exemple, le champ
a
stocke les valeurs de type entier, le champb
- chaîne de valeurs, etc.). Ils (a) regrouper logiquement connecté valeurs et (b) simplifier le changement de code en masquant les détails (par exemple, évolution de la structure de mise en page n'affectent pas la signature de la fonction de travail avec cette structure). Le dernier s'appelle l'encapsulation.Theroretically, un objet est une instance de la structure qui démontre un comportement en réponse à des messages d'être envoyés (c'est à dire, dans la plupart des langues, dont certaines méthodes). Dès lors, l'utilité de l'objet est dans ce comportement, pas de ses champs.
Différents objets peuvent démontrer des comportements différents en réponse à la même messages (les mêmes méthodes appelé), qui est appelé le "polymorphisme'.
Dans la plupart (mais pas tous) les langages objets appartiennent à des classes et les classes peuvent former des hiérarchies (qui est appelée "héritage").
Puisque les méthodes de l'objet peut travailler avec ses champs, les champs peuvent être cachés de l'accès par un code, sauf pour ces méthodes (par exemple, en les marquant comme
private
). Ainsi, l'encapsulation de niveau pour les objets peuvent être plus élevés que pour les structures.Noter que les différentes langues d'ajouter différents sémantique de ces termes.
E. g.:
dans le CLR langages (C#, VB.NET etc)
struct
s sont allouées sur la pile/dans les registres et les objets sont créés dans le tas.en C++
struct
s ont tous les champspublic
par défaut, et les objets (instances de classes) ont tous les champsprivate
.dans certains langages dynamiques les objets sont simplement des tableaux associatifs qui stockent les valeurs et les méthodes.
Bien sûr, vous pouvez utiliser les constantes ou quelque chose d'autre à la place de variables, j'essaie juste de montrer les principes de base.
Quand et pourquoi utiliser un objet, par opposition à une structure?
C'est une question-clé. Je suis en utilisant les structures et le code de procédure modules de fournir la plupart des avantages de la programmation orientée objet. Les structures de fournir plus de la capacité de stockage de données d'objets (autres que les propriétés en lecture seulement). Procédure modules de complétion de code similaire à celui fourni par les objets. Je peux entrer dans le module.fonction dans l'IDE à la place de l'objet.la méthode. Le code résultant regarde la même chose. La plupart de mes fonctions maintenant de retour stucts plutôt que des valeurs uniques. L'effet sur mon code a été spectaculaire, avec la lisibilité du code à la hausse et le nombre de lignes étant considérablement réduit. Je ne sais pas pourquoi programmation procédurale qui fait un large usage des structures n'est pas la plus courante. Pourquoi ne pas simplement utiliser la programmation orientée objet? Certaines des langues que j'utilise sont uniquement procédurale (PureBasic) et l'utilisation de structures permet à certains des avantages de la programmation orientée objet à être connu. D'autres langages permettent un choix de la procédure ou de la programmation orientée objet (VBA et Python). Actuellement, je le trouve plus facile à utiliser la programmation procédurale et dans ma discipline (écologie) je trouve qu'il est très difficile de définir des objets. Quand je ne peux pas comprendre comment des groupes de données et fonctions dans les objets, dans un point de vue philosophique, collection cohérente alors je n'ai pas de base pour la création de classes/objets. Avec les structures et les fonctions, il n'est pas nécessaire de définir une hiérarchie de classes. Je suis libre de mélanger des fonctions entre les modules qui m'aide à améliorer l'organisation de mon code que je vais. C'est peut-être un précurseur à aller OO.
Du Code écrit avec les structures ont des performances supérieures à celles de la programmation orientée objet en fonction du code. La programmation orientée objet code d'encapsulation, d'héritage et de polymorphisme, cependant, je pense que cette structure/fonction de base du code de procédure souvent les actions de ces caractéristiques. Une fonction retourne une valeur uniquement à son appelant, et uniquement dans la portée, et atteindre ainsi l'encapsulation. De même, une fonction peut être polymorphe. Par exemple, je peux écrire une fonction qui calcule la différence de temps entre les deux places avec deux algorithmes internes, celle qui considère que la ligne de changement de date et de celui qui n'en a pas. L'héritage se réfère généralement à des méthodes d'hériter d'une classe de base. Il est l'héritage de toutes sortes avec des fonctions qui appellent d'autres fonctions et l'utilisation des structures de transfert de données. Un exemple simple est le passage d'un message d'erreur grâce à une pile de fonctions imbriquées. Comme le message d'erreur est transmis, il peut être ajouté par l'appel de fonctions. Le résultat est une trace de la pile avec un très descriptif message d'erreur. Dans ce cas, un message hérité à travers plusieurs niveaux. Je ne sais pas comment décrire cela de bas en haut de l'héritage, (programmation événementielle?) mais il est une caractéristique de l'utilisation de fonctions qui retournent des structures qui est absent de la programmation procédurale à l'aide de simples valeurs de retour. À ce moment, je n'ai pas rencontré toutes les situations où la POO serait plus productif que des fonctions et des structures. Le plus surprenant pour moi est que très peu de code disponible sur l'internet est écrit de cette manière. Il me fait me demander si il y a une raison à cela?
Cette réponse peut avoir besoin de l'attention d'un plus expérimenté programmeur, mais l'une des différences entre les structures et les objets, c'est que les structures n'ont aucune capacité de réflexion tandis que les objets peuvent. La réflexion est la capacité d'un objet à rapporter les propriétés et les méthodes qu'elle a fait. C'est comment "de l'explorateur d'objets" peuvent trouver et liste de nouvelles méthodes et de propriétés créé dans les classes définies par l'utilisateur. En d'autres termes, la réflexion peut être utilisé pour travailler sur l'interface d'un objet. Avec une structure, il n'y a aucun moyen que je connaisse pour itérer sur les éléments de la structure pour savoir ce qu'ils sont appelés, de quel type ils sont et quelles sont leurs valeurs.
Si l'on est à l'aide de structures comme un remplacement pour les objets, on peut utiliser des fonctions pour fournir l'équivalent des méthodes. Au moins dans mon code, les structures sont souvent utilisées pour renvoyer des données à partir de fonctions définies par l'utilisateur dans les modules qui contiennent la logique métier. Les structures et les fonctions sont aussi facile à utiliser comme des objets, mais plutôt un manque de soutien pour les commentaires XML. Cela signifie que je ne cesse de regarder le bloc de commentaire en haut de la fonction, juste pour voir à quoi la fonction. Souvent, je dois lire la fonction de code source pour voir comment bord des cas sont traités. Lorsque les fonctions d'appeler d'autres fonctions, j'ai souvent à chasser quelque chose à plusieurs niveaux et il devient difficile de comprendre les choses. Cela conduit à un autre des avantages de la programmation orientée objet vs les structures et les fonctions. La programmation orientée objet a des commentaires XML qui apparaissent comme outil de conseils dans l'IDE (dans la plupart, mais pas tous les langages OOP) et en programmation orientée objet, il y a aussi des interfaces définies et souvent un diagramme d'objets (si vous choisissez de le faire). Il est devenu clair pour moi que la définition de l'avantage de la programmation orientée objet est la capacité de documenter ce que le code fait quoi et comment il se rapporte à un autre code - l'interface.
Je pense aussi qu'il est important de mentionner que la notion de structure est très similaire à un "objet" en Javascript, qui est défini de façon très différente des objets dans d'autres langues. Ils sont tous deux référencés comme "foo.bar" et les données sont structurées de la même façon.