我有自己的对象,我想扩展它,保存来自个人的数据并添加新信息。
所以代码是:
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();
所以我不会逐个填充属性的新属性,只需扩展一个属性,这要归功于扩展旧属性的新对象。
答案 0 :(得分:20)
您无法直接将Person
转换为Student
。
OOP中的继承附带hierarchy level
,即您可以将derived
类转换为base
类,但opposite is not possible
。 You cannot cast base class to derived class
一种可能的解决方案是:
使用Student
从人员创建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
}
}
答案 1 :(得分:4)
将Student
分配给Person
。
Person person = new Student("Paul", "Catch");
Student student = (Person)person;
student.code = "1234";
请注意,这使得所有的投射都毫无用处,更好的是:
Student student = new Student("Paul", "Catch");
student.code = "1234";
答案 2 :(得分:1)
在Student
类中,添加此构造函数,假设您的构造函数在Person
类中包含两个字符串
public Student(string val1, string val2) : base(val1, val2) { }
那么你可以像这样使用它
Student student = new Student("Paul", "Catch");
student.code = "1234";
答案 3 :(得分:1)
你所看到的问题是,在你的作业中,你正在试图将人物转向学生。这是不可能的,因为对象是Person,而Person类型不了解Student。
我对它的解释是对象具有特定的类型,无论你如何投射它。演员(就像灯光投射在物体上的方式)只是决定了你如何看待那个物体。在示例中,Person不了解学生,因此无论您如何看待,都无法将其分配给学生。
然而,学生对象可以向一个人转发,因为每个学生都是一个人。您始终可以向上转换为基类,但不能始终向下转换为派生类。
我希望这能给你一些清晰度。 (我也希望我完全正确。)
答案 4 :(得分: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";