Maison >développement back-end >C++ >Un objet de classe de base peut-il être explicitement converti en une référence de classe dérivée en C# ?
Casting explicite de la classe de base vers la classe dérivée en C# : un risque d'exécution
L'affectation directe d'un objet de classe de base à une référence de classe dérivée à l'aide d'un transtypage explicite en C# est problématique et entraînera généralement une exception d'exécution.
Cette limitation découle de la nature fondamentale des références de classe dérivées. Une telle référence attend intrinsèquement un objet du type classe dérivée (ou null). L'attribution d'un objet de classe de base viole cette attente, conduisant à un comportement imprévisible.
Considérez cet exemple :
<code class="language-csharp">object o = new object(); string s = (string)o; // This will throw an InvalidCastException int i = s.Length; // Unreachable code</code>
Tenter d'accéder aux membres spécifiques à la classe dérivée (s.Length
dans ce cas) après une distribution invalide est impossible. Le casting échoue car o
ne contient pas d'instance string
.
Alternatives recommandées
Si vous devez effectuer une conversion entre les types de base et dérivés, évitez le casting explicite. Utilisez plutôt des méthodes plus sûres :
Créer une instance de type dérivé : Écrivez une méthode qui instancie un objet de classe dérivé, en remplissant ses propriétés en fonction des données de l'objet de classe de base. Cette approche garantit la sécurité du type et un comportement prévisible.
Refactoriser l'héritage : Réévaluer votre hiérarchie d'héritage. Si des conversions sont fréquemment nécessaires, la relation d'héritage peut ne pas être conçue de manière optimale. Envisagez des modèles de conception alternatifs ou restructurez vos cours.
En évitant le casting direct et en adoptant ces alternatives, vous améliorerez la robustesse du code et éviterez les erreurs d'exécution.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!