2010-12-15 15 views
3

Ich habe den folgenden Code, ich bekomme die folgende Ausnahme "InvalidCastException: Kann Objekt des Typs 'Mitarbeiter' nicht umwandeln, um 'EmployeeProfile' einzugeben."C# Vererbung & Casting

Vielleicht ist mein Gehirn ausgebrannt, aber ich dachte, Sie können einen Subtyp auf seinen Basistyp übertragen? Was fehlt mir hier? Vielleicht ist es ein Urlaub ... Danke!

Antwort

14

Sie können einen Subtyp zu seinem Basistyp umwandeln. Sie übergeben jedoch eine Instanz des Basistyps an den Subtyp.

Ein EmployeeProfile ist ein Mitarbeiter. Nicht unbedingt umgekehrt.

Also die würde Arbeit:

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

jedoch stinkt dieses Modell schlechten Design. Ein Mitarbeiterprofil ist nicht eine besondere Art von Mitarbeiter, oder? Es macht mehr Sinn für einen Mitarbeiter ein Profil zu haben. Sie sind hier hinter dem Kompositionsmuster.

+0

Ich habe einen kleinen Fehler in meinem Beitrag - bitte sehen Sie die aktualisierte wie: EmployeeProfile prof = (EmployeeProfile) emp; // InvalidCastException hier –

+0

@WeekendWarrior: Das ist egal. Sie können eine Instanz des Basistyps immer noch nicht in den abgeleiteten Typ umwandeln. Du könntest * in die andere Richtung werfen. – cdhowie

+0

Was cdhowie sagt, steht immer noch, Sie versuchen immer noch, einen Basistyp in einen Subtyp umzuwandeln. – DeusAduro

0

Sie gehen in die falsche Richtung. In Ihrem Code ist ein EmployeeProfile eine spezielle Art von Mitarbeiter, nicht umgekehrt. Also, wenn Sie versuchen, in umgekehrter Richtung zu werfen, die Compiler sagt, dass ein ‚Mitarbeiter‘ nicht von ‚EmployeeProfile‘ abgeleitet ist

1

Vielleicht ist mein Gehirn ausgebrannt, aber ich haben Sie einen Subtyp seine werfen können Basistyp?

Sie versuchen, einen Basistyp auf seinen Subtyp zu übertragen. Genau das Gegenteil von dem, was Sie sagen:

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

Sie werden ein Verfahren in EmployeeProfile müssen taht ein Employee als Argument nimmt und schafft eine EmployeeProfile.

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

    return empprof; 
} 
13

Alle Antworten sind richtig ... bietet nur eine no frills einfache Erklärung ...

class Employee 

class Female : Employee 

class Male: Employee 

Nur weil Sie sind ein Employee nicht Sie machen einen Female ...

+1

Dies ist eine ausgezeichnete Art darüber nachzudenken ... das hilft sehr. vielen Dank. –

0

Sie müssen eine Bibliothek wie Automapper verwenden. Diese Bibliothek kann die übereinstimmenden Eigenschaften für ein Objekt füllen:

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

EmployeeProfile prof = Mapper.Map<EmployeeProfile>(emp);