25

我有自己的对象,我想扩展它,从一个人那里保存数据并添加新信息。

所以代码是:

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

但是当我尝试初始化它并添加新值时:

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

我有System.InvalidCastException: Unable to cast object of type 'MyLayer.Person' to type 'Student'.

我错过了什么吗?

编辑:也许我放错了 Person 类。您必须假设它来自作为对象的数据库,例如Person person = new MyPersons().First();

所以我不会一个一个地用属性填充新的,只是扩展一个属性,这要归功于扩展旧对象的新对象。

4

5 回答 5

32

您不能直接将 a 转换PersonStudent

OOP 中的继承带有hierarchy level,即您可以将derived类强制转换为base类,但是opposite is not possible.You cannot cast base class to derived class

一种可能的解决方案是:

从PersonStudent使用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
    }
}
于 2013-03-06T15:28:22.743 回答
5

将 a 分配Student给您的Person.

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

请注意,这使得所有铸造都变得毫无用处,更好的是:

Student student = new Student("Paul", "Catch");
student.code = "1234";
于 2013-03-06T15:22:39.867 回答
2

在你的Student类中,添加这个构造函数,假设你有一个在Person类中有两个字符串的构造函数

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

那么你可以像这样使用它

Student student = new Student("Paul", "Catch");
student.code = "1234";
于 2013-03-06T15:32:47.370 回答
1

您看到的问题是,在您的作业中,您试图将 Person 转换为 Student。这是不可能的,因为对象是 Person,而 Person 类型不知道 Student。

我对它的解释是对象具有特定的类型,无论您如何转换它。投射(就像光线投射到物体上的方式一样)只是决定了你如何看待那个物体。在示例情况下,Person 不了解 Student,因此无论您如何看待它,都无法将其分配给 student。

然而,一个学生对象可以向上转换为一个人,因为每个学生都是一个人。您始终可以向上转换为基类,但不能始终向下转换为派生类。

我希望这能让你清楚。(我也希望我完全正确。)

于 2013-03-06T21:19:51.410 回答
0

您的转换不正确,一个人可以成为学生(不是相反)

改成:

Student student = (Student)person;

尽管可以避免您的类型转换..

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

变成....

Student student = new Student("Paul", "Catch");
student.code = "1234";
于 2013-03-06T15:25:05.080 回答