8
votes

C # Héritage et casting

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);
    }


0 commentaires

6 Réponses :


18
votes

vous peut 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.

de sorte que serait travail: xxx

Cependant, ce modèle requille de mauvais design. Un profil d'employé n'est pas un type spécial d'un employé, est-ce? Il a plus de sens pour un employé avoir un profil. Vous êtes après le motif de composition ici.


5 commentaires

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 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.



0
votes

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»


0 commentaires

1
votes

Peut-être que mon cerveau est brûlé, mais je pensais que vous pouvez lancer un sous-type à son Type de base?

Vous essayez de lancer un bassetype à son sous-type. Exactement le contraire de ce que vous dites: xxx


0 commentaires

0
votes

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;
}


1 commentaires

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.



16
votes

Toutes les réponses sont correctes ... il suffit de fournir une explication simple sans fioritures ... xxx

juste parce que vous êtes un employé ne fait pas de vous une Femme ...


2 commentaires

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!



0
votes

Vous devez utiliser une bibliothèque comme automapper . Cette bibliothèque peut remplir les propriétés assorties d'un objet: xxx


0 commentaires