> On n'a pas besoin de la notion d'objet pour mettre des apis autour des données... par contre, pour faire l'héritage, c'est essentiel.
Tu n'as toujours pas compris : mettre des APIs autour des données, C'EST la notion objet. Regarde la série des fonctions fopen(), fclose(), fprintf(), etc... de la lib C. C'est une API objet, avec des méthodes sur une structure de donnée opaque (FILE*). Laisse tomber l'héritage, c'est presque accessoire et très souvent mal employé. Regarde Qt justement, la hierarchie des classes est simplissime, tu n'as presque jamais plus de 2 niveaux d'héritage (QObject->QWidget->QFoobar). A ce sujet je te conseille l'intro de Design Patterns, excellent texte qui remet l'héritage en perspective et parle d'autres méthodes pour réutiliser du code, comme l'agrégation (décidément y a pas une page de ce bouquin qui ne soit indispensable).
> Le C# n'a pas du tout le même genre de mécanisme que le C++
The virtual keyword is used to modify a method or property declaration, in which case the method or the property is called a virtual member. The implementation of a virtual member can be changed by an overriding member in a derived class.
When a virtual method is invoked, the run-time type of the object is checked for an overriding member.
C'est exactement la même chose qu'en C++.
> Enfin, je n'ai pas doublement faux, comme l'exemple suivant le montre
Ah, vraiment ? Essayons voir :
#include
class A
{
public:
void toto() { std::cout << "Hello World A\n"; }
};
class B : public A
{
public:
void toto() { std::cout << "Hello World B\n"; }
};
void affiche(A a)
{
a.toto();
}
int main()
{
B b;
affiche(b);
return 0;
}
Je compile et j'execute, ça m'affiche "Hello World A". Jusque là t'as tout bon. Maintenant, j'ajoute 'virtual' devant les 2 déclarations de toto(), et là surprise, ça m'affiche toujours "Hello World A". Ça alors. T'as une idée de pourquoi ?
> Je réaffirme donc mon propos
Et moi le mien : tu ne sais absolument pas de quoi tu parles. Ta conception de l'objet est celle d'un débutant qui croit que l'héritage est le seul outil dont on dispose en POO (erreur très courante, tout le monde passe par là), tu n'a pas compris à quoi sert le mot clé "virtual" en C++, et il te manque aussi la notion de polymorphisme.
[^] # Re: Langage objet...
Posté par Guillaume Laurent . En réponse à la dépêche Les nouveautés de Qt 4. Évalué à 1.
Tu n'as toujours pas compris : mettre des APIs autour des données, C'EST la notion objet. Regarde la série des fonctions fopen(), fclose(), fprintf(), etc... de la lib C. C'est une API objet, avec des méthodes sur une structure de donnée opaque (FILE*). Laisse tomber l'héritage, c'est presque accessoire et très souvent mal employé. Regarde Qt justement, la hierarchie des classes est simplissime, tu n'as presque jamais plus de 2 niveaux d'héritage (QObject->QWidget->QFoobar). A ce sujet je te conseille l'intro de Design Patterns, excellent texte qui remet l'héritage en perspective et parle d'autres méthodes pour réutiliser du code, comme l'agrégation (décidément y a pas une page de ce bouquin qui ne soit indispensable).
> Le C# n'a pas du tout le même genre de mécanisme que le C++
T'es sur ? Lis bien :
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cs(...)
The virtual keyword is used to modify a method or property declaration, in which case the method or the property is called a virtual member. The implementation of a virtual member can be changed by an overriding member in a derived class.
When a virtual method is invoked, the run-time type of the object is checked for an overriding member.
C'est exactement la même chose qu'en C++.
> Enfin, je n'ai pas doublement faux, comme l'exemple suivant le montre
Ah, vraiment ? Essayons voir :
#include
class A
{
public:
void toto() { std::cout << "Hello World A\n"; }
};
class B : public A
{
public:
void toto() { std::cout << "Hello World B\n"; }
};
void affiche(A a)
{
a.toto();
}
int main()
{
B b;
affiche(b);
return 0;
}
Je compile et j'execute, ça m'affiche "Hello World A". Jusque là t'as tout bon. Maintenant, j'ajoute 'virtual' devant les 2 déclarations de toto(), et là surprise, ça m'affiche toujours "Hello World A". Ça alors. T'as une idée de pourquoi ?
> Je réaffirme donc mon propos
Et moi le mien : tu ne sais absolument pas de quoi tu parles. Ta conception de l'objet est celle d'un débutant qui croit que l'héritage est le seul outil dont on dispose en POO (erreur très courante, tout le monde passe par là), tu n'a pas compris à quoi sert le mot clé "virtual" en C++, et il te manque aussi la notion de polymorphisme.