Je reçois l'exception suivante:
InvalidCastException: impossible de lancer l'objet de type 'Employee' à taper 'EmployeeProfile'. P> BlockQuote>
J'ai le code suivant: P>
private class Employee { public string Name { get; private set; } public Employee() { this.Name = "employee"; } public override string ToString() { return this.Name; } } private class EmployeeProfile : Employee { public string Profile { get; private set; } public EmployeeProfile() : base() { this.Profile = string.Format("{0}'s profile", this.Name); } public override string ToString() { return this.Profile; } } public void RunTest() { Employee emp = new Employee(); EmployeeProfile prof = (EmployeeProfile)emp; // InvalidCastException here System.Console.WriteLine(emp); System.Console.WriteLine(prof); }
6 Réponses :
vous peut em> jeter un sous-type à son type de base. Mais vous jetez une instance du type de base au sous-type. Un employé de l'employé est-un employé. Pas nécessairement l'inverse l'inverse. P> de sorte que serait em> travail: p> Cependant, ce modèle requille de mauvais design. Un profil d'employé n'est pas em> un type spécial d'un employé, est-ce? Il a plus de sens pour un employé avoir em> un profil. Vous êtes après le motif de composition ici. P> p>
J'ai fait une petite erreur dans mon post - veuillez consulter la mise à jour de: EmployeeProfile Prof = (employéProfile) EMP; // InvalidcastException ici
@Weekendwarrior: Cela n'a pas d'importance. Vous ne pouvez toujours pas lancer une instance du type de base au type dérivé. Vous pourrait i> lancer dans l'autre sens.
Qu'est-ce que Cdhowie dit toujours, vous essayez toujours de jeter un baseype dans un sous-type.
Le modèle de composition a du sens. EmployeeProfile a une relation individuelle avec un employé - il contient simplement des propriétés supplémentaires. Merci pour le tuyau!
@Weekendwarrior: Bien sûr, pas de problème.
Vous allez la mauvaise direction. Dans votre code, un exemplaire de l'employé est un type d'employé spécial, pas l'inverse. Donc, lorsque vous essayez de lancer en sens inverse, le compilateur disait qu'un «employé» n'est pas dérivé de «employé de l'emploi» p>
Peut-être que mon cerveau est brûlé, mais je pensais que vous pouvez lancer un sous-type à son Type de base? P>
Vous essayez de lancer un bassetype à son sous-type. Exactement le contraire de ce que vous dites: p>
xxx pré> blockQuote>
Vous aurez besoin d'une méthode dans le profil de l'employé qui prend un employé comme argument et crée un profil d'employé.
EmployeeProfile enrichEmployee(Employee emp)
{
EmployeeProfile empprof = new EmployeeProfile();
empprof.property1 = emp.property1;
empprof.property2 = emp.property2;
empprof.property3 = emp.property3;
return empprof;
}
Il n'est pas strictement vrai que vous avez "besoin" d'une méthode dans la classe dérivée qui attribue toutes les propriétés de la classe de base. Il s'agit d'une manière à long terme d'effectuer l'affectation de propriétés, tandis qu'une affectation de niveau d'objet fonctionnera pour toutes les propriétés de correspondance disponibles.
Toutes les réponses sont correctes ... il suffit de fournir une explication simple sans fioritures ... juste parce que vous êtes un employé code> code> ne fait pas de vous une Femme CODE> ... P> P>
C'est une excellente façon de penser à ce sujet ... cela aide beaucoup. Merci beaucoup.
Si vous aviez une liste d'employés et d'hommes et de femmes avaient des propriétés uniques, comment compteriez-vous, par exemple, combien de femmes ont donné naissance? Ou combien de mâles ont eu une vasectomie? Lol essayant de trouver des exemples à la suite des classes mentionnées. J'ai besoin de savoir comment jeter de manière appropriée à leur type pour accéder aux propriétés uniques. MERCI!
Vous devez utiliser une bibliothèque comme automapper . Cette bibliothèque peut remplir les propriétés assorties d'un objet: