En C#, existe-t-il un moyen de faire en sorte qu'une classe DOIT avoir un constructeur sans paramètre?Constructeurs sans paramètre
Répondre
Si vous parlez de contraintes génériques, oui:
class SomeContainer<T> where T : new() {
...
}
Si vous parlez d'héritage. Il n'est pas possible d'exiger que chaque classe qui implémente votre interface ou hérite de votre classe de base possède un constructeur sans paramètre.
Le mieux que vous pouvez faire est la réflexion d'utilisation dans votre constructeur de base pour lancer une exception (à l'exécution), comme ceci:
abstract class MyBase {
protected MyBase() {
if (GetType().GetConstructor(Type.EmptyTypes) == null)
throw new InvalidProgramException();
}
}
Si vous parlez d'une seule classe, oui; il suffit d'en mettre un.
Cela dépend de ce que vous voulez dire. Par exemple, vous pouvez contraindre un paramètre de type générique dans une classe ou une méthode à avoir un constructeur sans paramètre avec le mot-clé new
, mais il n'y a pas de véritable méthode pour limiter une définition de classe réelle au-delà.
public void DoSomething<T>() where T : new() { }
Comme mentionné dans la documentation MSDN officielle, le compilateur C# génère automatiquement un constructeur sans paramètre qui initialise toutes les variables membres aux valeurs par défaut. Si vous souhaitez appliquer votre propre implémentation, vous pouvez simplement faire ceci:
BaseClass classe { BaseClass() {// Mise en œuvre du constructeur parameterless} }
Si vous faites référence à des contraintes génériques, alors se référer à la publication de SLaks.
Références
En outre, vous pouvez forcer une classe à ne pas avoir un constructeur sans paramètre en utilisant le modificateur d'accès privé. –
Les sous-classes peuvent toujours avoir un constructeur sans paramètre, même si le constructeur de la classe de base est privé, tant qu'au moins un constructeur de base est public ou protégé (ou interne si la sous-classe est dans le même assembly). –
@Postman: Cela limiterait la sous-classe à toujours fournir certains paramètres au constructeur de base, mais c'est loin de "ne fonctionnera pas". –
J'ai rencontré un problème comme celui-ci un certain nombre de fois, je pense qu'il ya une exigence pour les constructeurs abstraits/interface. Le problème est lorsque vous utilisez Activator.CreateInstance
ou une autre technique pour instancier un type que vous ne pouvez pas implémenter (IoC assez commun). La vie serait beaucoup plus facile si vous pouviez forcer un développeur à implémenter un constructeur avec les bons paramètres - même si le but est simplement de passer les params au constructeur de base. La contrainte new()
a aidé le problème un peu depuis 2.0, mais elle ne résout toujours pas le problème en n'utilisant pas de génériques, ou si vous voulez des arguments spécifiques (et que vous ne voulez pas vous tromper avec les maladroits) ConstructorInfo, qui ne peut pas être vérifié de manière statique.)
Generics peut appliquer, mais nous ne sommes pas toujours en utilisant les médicaments génériques, p
Si vous utilisez des tests unitaires, vous pouvez utiliser la réflexion pour trouver tous les types qui répondent le modèle que vous voulez avoir constructeurs sans paramètre (par exemple, tout dérivé de MyBaseObject
, ou tout dans l'espace de noms Foo.Bar
), et vérifier de cette façon (par trouver le constructeur sans paramètre).
Si vous voulez aussi affirmer cela au moment de l'exécution (peut-être dans #DEBUG
), des choses comme les constructeurs statiques peuvent être des points utiles pour injecter des contrôles de type supplémentaires.
- 1. Grensesnitt avec des classes sans constructeurs sans paramètre?
- 2. initialisation sans constructeurs et Dictionnaires
- 3. Seuls les constructeurs et les initialiseurs sans paramètre sont pris en charge dans LINQ to Entities
- 4. constructeurs et initialiseurs sont sans paramètre pris en charge dans LINQ to Entities
- 5. constructeurs
- 6. C#: constructeurs héritiers
- 7. Comment fournir de nombreux constructeurs, mais sans trop de dépendances?
- 8. Webservice ASP.Net - Constructeurs avec paramètres
- 9. Constructeurs Unity
- 10. Constructeurs JavaScript
- 11. constructeurs Hériter
- 12. Constructeurs VB.NET
- 13. constructeurs php
- 14. Constructeurs moqueurs dans Ruby
- 15. std :: constructeurs unordered_set
- 16. Modifier un objet sans l'utiliser comme paramètre
- 17. Placement de nouveaux constructeurs et de constructeurs par défaut
- 18. ASP.NET MVC: constructeurs de contrôleurs
- 19. Unité et constructeurs
- 20. Constructeurs génériques et réflexion
- 21. C++ constructeurs privés
- 22. compilateur généré constructeurs
- 23. Scala: les constructeurs cari
- 24. Constructeurs nommés dans Scala?
- 25. Objectif des constructeurs PHP
- 26. Initialisateurs d'objet et constructeurs
- 27. javascript trop d'arguments constructeurs
- 28. Constructeurs d'objet valides
- 29. Boost constructeurs d'image GIL
- 30. Constructeurs de classes partielles
Veuillez fournir plus de détails. – SLaks