C # Наследование и Кастинг - PullRequest
3 голосов
/ 15 декабря 2010

У меня следующий код, я получаю следующее исключение: «InvalidCastException: невозможно преобразовать объект типа« Сотрудник »в тип« EmployeeProfile ».»

    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 ]

15 голосов
/ 15 декабря 2010

Вы можете привести подтип к его базовому типу.Но вы преобразуете экземпляр базового типа в подтип.

EmployeeProfile - это Employee.Не обязательно наоборот.

Так что будет работать:

EmployeeProfile prof = new EmployeeProfile();
Employee emp = prof;

Однако эта модель пахнет плохим дизайном.Профиль сотрудника не является специальным видом сотрудника, не так ли?Для сотрудника более логично иметь профиль .Вы после композиции здесь.

13 голосов
/ 15 декабря 2010

Все ответы верны ... просто предоставим простое объяснение без излишеств ...

class Employee

class Female : Employee

class Male: Employee

То, что вы Employee, не делает вас Female ...

1 голос
/ 15 декабря 2010

Может быть, мой мозг сожжен, но я думал, что вы можете привести подтип к его базовый тип?

Вы пытаетесь привести базовый тип к его подтипу. Точно противоположное тому, что вы говорите:

Employee emp = new Employee();
EmployeeProfile prof = emp;
0 голосов
/ 06 декабря 2017

Вам нужно использовать такую ​​библиотеку, как Automapper .Эта библиотека может заполнить соответствующие свойства для объекта:

Mapper.Initialize(cfg => {
    cfg.CreateMap<EmployeeProfile,Employee>();
});

EmployeeProfile prof = Mapper.Map<EmployeeProfile>(emp);
0 голосов
/ 15 декабря 2010

Вам потребуется метод в EmployeeProfile, который принимает Employee в качестве аргумента и создает EmployeeProfile.

EmployeeProfile enrichEmployee(Employee emp)
{
   EmployeeProfile empprof = new EmployeeProfile();
   empprof.property1 = emp.property1;
   empprof.property2 = emp.property2;
   empprof.property3 = emp.property3;

   return empprof;
}
0 голосов
/ 15 декабря 2010

Вы идете не в том направлении. В вашем коде EmployeeProfile - это особый тип Employee, а не наоборот. Поэтому, когда вы пытаетесь привести в обратном порядке, компилятор говорит, что «Employee» не является производным от «EmployeeProfile»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...