2013-03-06 38 views
7

Ho il mio oggetto e mi piacerebbe estenderlo, salvando i dati da una persona e aggiungendo nuove informazioni.Come estendere una classe in C#?

Quindi il codice sarebbe:

public class Student : Person 
{ 
    public string code { get; set; } 
} 

ma quando provo ad init e aggiungere il nuovo valore:

Person person = new Person("Paul", "Catch"); 
Student student = (Person)person; 
student.code = "1234"; 

ho ottenuto System.InvalidCastException: Unable to cast object of type 'MyLayer.Person' to type 'Student'.

mi manca un certo punto?

EDIT: forse ho sbagliato a mettere quella classe Persona. È necessario supporre che diventi da un DB come oggetto, come Person person = new MyPersons().First();

Quindi non inserirò il nuovo con le proprietà una per una, estendiamo solo una proprietà grazie al nuovo oggetto che estende quello vecchio.

+0

Mostraci la classe 'Persona' .. –

+0

Mostrare la definizione di classe' Persona'. –

+0

Non posso! In realtà non è "Persona", è un'altra classe in una DLL, ma questo non dovrebbe essere importante? – markzzz

risposta

14

Non è possibile convertire un Person a Student direttamente.

Inheritance in OOP viene fornito con hierarchy level, vale a dire si può lanciare la classe derived-base classe, ma il opposite is not possible. You cannot cast base class to derived class

Una possibile soluzione è:

Creare Student da Persona che utilizza constructor overload.

public class Person 
{ 
    public string FName { get; set; } 
    public string LName { get; set; } 

    public Person(string fname, string lname) 
    { 
     FName = fname; 
     LName = lname; 
    } 
} 

public class Student : Person 
{ 
    public Student(Person person, string code) 
     : base(person.FName, person.LName) 
    { 
     this.code = code; 
    } 
    public Student(Person person) 
     : base(person.FName, person.LName) 
    { 

    } 

    public string code { get; set; } 
} 



static class Program 
{ 
    static void Main(string[] args) 
    { 
     Person person = new Person("Paul", "Catch"); 

     // create new student from person using 
     Student student = new Student(person, "1234"); 
     //or 
     Student student1 = new Student(person); 
     student1.code = "5678"; 

     Console.WriteLine(student.code); // = 1234 
     Console.WriteLine(student1.code); // = 5678 
    } 
} 
+0

Sì, è necessario utilizzare un costruttore di copie come questo per creare una nuova istanza di 'Student' da un' Person'. Non puoi * estendere * Persona. –

+0

posso usare una base "generica"? Perché la Persona ha più di 20 proprietà ... il che è terribile scrivi ALL – markzzz

+0

@paizza - e in che modo 'Generic' può aiutarti a gestire 20 proprietà? –

4

Assegnare un Student al numero Person.

Person person = new Student("Paul", "Catch"); 
Student student = (Person)person; 
student.code = "1234"; 

Si noti che questo fa tutta la colata abbastanza inutile, meglio è:

Student student = new Student("Paul", "Catch"); 
student.code = "1234"; 
+0

Ma devo iniziare ad avere un'istanza di Persona, non di studente :) – markzzz

+0

Il cast deve essere per 'Student', non' Person'. – Servy

0

vostra conversione non è corretto, una persona può diventare uno studente (non viceversa)

Change a:

Student student = (Student)person; 

Anche se il tipo di getto può essere evitato ..

Person person = new Person("Paul", "Catch"); 
Student student = (Person)person; 
student.code = "1234"; 

Diventa ....

Student student = new Student("Paul", "Catch"); 
student.code = "1234"; 
+0

come ho detto, ho ricevuto lo stesso errore – markzzz

+0

Sì uomo, ma non creo "Persona", l'ho già (diventa con più di 20 proprietà, quindi voglio crearne uno nuovo copiarlo uno per uno) . Ho solo bisogno di "estendere" 1 proprietà in una classe – markzzz

1

Nella classe Student, aggiungere questo costruttore, a patto di avere un costruttore che prende due stringhe nella classe Person

public Student(string val1, string val2) : base(val1, val2) { } 

poi si può usare in questo modo

Student student = new Student("Paul", "Catch"); 
student.code = "1234"; 
0

Il problema che stai vedendo è che nel tuo incarico stai provando a scaricare Person to Student.Questo non è possibile, perché l'oggetto è una Persona, e il tipo Persona non ha conoscenza di Studente.

La mia interpretazione è che gli oggetti hanno un tipo specifico, indipendentemente da come lo si trasmette. Un cast (come il modo in cui la luce è lanciata su un oggetto) stabilisce semplicemente come vedi quell'oggetto. Nel caso di esempio, una persona non ha conoscenza di uno studente, quindi non importa come la si guardi, non è possibile assegnarlo allo studente.

Un oggetto studente, tuttavia, può essere trasmesso a una persona, poiché ogni studente è una persona. Puoi sempre upcast alle classi base, ma non puoi sempre downcast alle classi derivate.

Spero che questo ti dia una certa chiarezza. (Spero anche di averlo capito bene.)

+0

Sì, ma come posso eseguire lo streaming di Student prendendo in considerazione Person? In effetti, ho già un'istanza con Person, con i dati aziendali ad essa collegati. Mi piacerebbe fare una "copia" della persona ed estenderla ... – markzzz

Problemi correlati