J'ai remarqué qu'il y a des mots-clés scellés et d'interface en C++. Est-ce juste pour CLR C++? Si non, quand ont été scellés et l'interface ajoutée à la norme C++? Ont-ils la même signification en C++ qu'en C#? Si non, comment puis-je obtenir l'équivalent en C++ standard?C++ scellé et interface
Répondre
sealed
et interface
les mots-clés sont uniquement pour C++/CLI. Voir Language Features for Targeting the CLR pour plus de détails.
En standard, C++ interface
peut être remplacé par une classe virtuelle pure et un héritage multiple. Sealed
mot-clé pourrait être remplacé par boost::noninheritable
(qui n'est pas une partie officielle de boost encore).
Un interface
peut être dupliqué en C++ avec une classe virtuelle pure, en profitant du fait que vous pouvez faire plusieurs héritages.
sealed
peut être ailé avec un constructeur privé et une sorte de modèle d'usine (pour obtenir réellement des instances de la classe scellée). Il y a quelques autres exemples à the C++ FAQ Lite.
comment peut-on dupliquer scellé en C++ (C++ standard) , y a-t-il un moyen? – Tom
par la plupart des définitions, un mixin implémente un certain comportement à ajouter à une classe, et n'est pas une interface. –
@Pete: merci de le signaler. Actualisé. –
__interface
est valide dans Visual C++ à partir de VS 2005. Il fournit une validation à la compilation supplémentaire que l'interface ressemble et sent comme on devrait. (L'article MSDN lié contient tous les détails.)
__sealed
, semble toutefois faire partie des «extensions managées pour C++».
'__interface' et' __sealed' sont issus de l'ancienne syntaxe. Vous ne devriez pas les utiliser. –
'__sealed' est vieux, oui. Mais '__interface'? A-t-il été remplacé par quoi que ce soit dans le monde non géré? – reuben
Désolé, __interface est toujours utilisé pour les interfaces non gérées. Jamais utilisé :) Mais ce n'est pas lié à C++/CLI et ce n'est pas la norme C++. Dans le monde géré, on devrait utiliser 'sealed' et' interface', sans traits de soulignement. –
interface
et sealed
ont été ajoutés par MS pour l'implémentation C++/CLI. Cependant, les versions actuelles du compilateur Microsoft font aussi support the sealed
keyword for native code - mais c'est une extension que vous ne trouverez probablement jamais ailleurs. Notez que MS a fait quelque chose de similaire avec override
- c'est une extension de mot clé dans MSVC qui indique qu'une fonction est destinée à remplacer une fonction virtuelle de classe de base (le compilateur se plaindra si cela ne s'avère pas être le cas). Pour une raison quelconque, Microsoft n'a pas fait la même chose pour le mot-clé interface
, mais ils ont l'extension de mot-clé __interface
qui fait ce que vous attendez. Je soupçonne qu'ils n'ont pas ajouté une extension de mot clé native interface
parce que l'identificateur interface
se trouve dans beaucoup de code existant (peut-être comme une macro qui se résout à class
) - mais c'est juste une supposition de ma part.
Un autre facteur pourquoi __interface
a les underscores en sealed
et override
ne pourrait être pas parce que ces derniers sont "context-sensitive keywords" - une technologie qui MS introduit en C++/CLI qui fait des mots-clés identificateurs que dans certains contextes de grammaire - si sealed
et override
peuvent toujours être utilisés comme noms de variables ou de fonctions, même s'ils sont également utilisés comme mots-clés. Le compilateur peut déterminer à partir du contexte quelle utilisation est appropriée. Peut-être qu'ils ne pouvaient pas s'en tirer avec ça pour interface
.
Quoi qu'il en soit vous pouvez peut-être obtenir le meilleur des deux mondes avec quelque chose comme:
#if _MSC_VER >= 1400
#define OVERRIDE override
#define SEALED sealed
#define INTERFACE __interface
#else
#define OVERRIDE
#define SEALED
#define INTERFACE class
#endif
que je blatently volé:
+1 pour m'avoir aidé à comprendre pourquoi mon code C++/CLI utilisant 'interface' comme identifiant ne compilait pas. C'était en effet une macro. Mettez dans une interface '#undef 'et bien sûr, il a bien compilé. – Kevin
sealed
et interface
ne sont pas en Normes C++. Cependant, C++ 11 ajoute un mot-clé final
contextuelle avec la même sémantique que mot-clé sealed
Microsoft:
// 'final' works on methods.
class Base
{
public:
virtual void foo() final { }
};
// This is an error in C++11:
class Derived1 : public Base
{
public:
// Error: Base's foo is final
virtual void foo() { }
};
// 'final' also works on individual virtual methods.
class FinalBase final { };
// This is an error in C++11:
class Derived2 : public FinalBase { };
Avec une macro-abstraction mineure pour la portabilité, je ne vois pas de raison de ne pas utiliser sealed
aujourd'hui, si c'est utile et vous compilez régulièrement avec un compilateur qui le supporte (ou son synonyme normalisé final
).
- 1. constructeur privé, sous-classe et scellé
- 2. Interface fluide et héritage en C++
- 3. Pourquoi Predicate <> est-il scellé?
- 4. C# - Interface - Type initilization
- 5. Shared Interface et ReaderWriterLockSlim
- 6. Interface graphique avancée et base de données dans C#
- 7. C#: Inherited/interface membre statique?
- 8. Interface graphique C# avec onglets
- 9. C# - Interface dans une classe
- 10. Délégués et événements dans Interface?
- 11. jMock Mocking Classes et Interface
- 12. Interface utilisateur graphique C# dans MVC
- 13. Interface C# vs accès de classe
- 14. NDIS Interface de pilote intermédiaire vers C#
- 15. Interface utilisateur à onglets en C#
- 16. Question concernant interface fluide en C#
- 17. Création d'une interface utilisateur dynamique avec C#?
- 18. C#: Interface générique pour les nombres
- 19. Solution de contournement C++/CLI pour l'implémentation d'une interface C++
- 20. Interface utilisateur jQuery Sortable et dialogue
- 21. iPhone Interface Builder et les délégués
- 22. Eviter le blocage en utilisant une interface publique non virtuelle et des verrouillages en C++
- 23. Pourquoi une classe C# peut-elle hériter d'une même interface de manière implicite et explicite?
- 24. C# Génériques et collections
- 25. Apple Ipod et C#
- 26. Java Native Interface avec n'importe quel code C arbitraire
- 27. Comment lancer une interface en tant que type dans C#?
- 28. Création d'une interface de recherche dans ASP.NET MVC - C#
- 29. iChat Style Interface
- 30. Comment utiliser une interface COM versionnée de C#?
Remarque: 'sealed' peut être utilisé en code C++ natif si vous souhaitez utiliser une extension MS. Merci pour le pointeur sur boost :: non-héritable. –
Je ne recommanderais pas d'utiliser le mot-clé 'sealed' en C++ natif (même dans Visual C++) puisque ce mot-clé ne fait pas partie de C++ Standard. –
@ Michael: Ce n'est pas natif s'il nécessite une extension. Je dirais tuo peut utiliser scellé dans le code MS C++/CLI. Ce qui n'est pas tout à fait le même que C++. –