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クラスを置くのを間違えました。次のようなオブジェクトとしてのDBからのものになると想定する必要があります。Person person = new MyPersons().First();

したがって、新しいオブジェクトにプロパティを1つずつ入力するのではなく、古いオブジェクトを拡張する新しいオブジェクトのおかげで、1つのプロパティを拡張するだけです。

4

5 に答える 5

32

PersonStudent直接変換することはできません。

OOPの継承には、が付属しています。つまり、クラスをクラスにhierarchy levelキャストできますが、。derivedbaseopposite is not possibleYou cannot cast base class to derived class

考えられる解決策の1つは次のとおりです。

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
    }
}
于 2013-03-06T15:28:22.743 に答える
5

にを割り当て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

クラスに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

あなたが見ている問題は、あなたの課題で、PersontoStudentをダウンキャストしようとしていることです。オブジェクトがPersonであり、PersonタイプにはStudentの知識がないため、これは不可能です。

私の解釈では、オブジェクトは、キャスト方法に関係なく、特定のタイプを持っています。キャスト(オブジェクトに光を当てる方法など)は、そのオブジェクトをどのように見るかを決定するだけです。この例の場合、人は学生の知識を持っていないため、どのように見ても、学生に割り当てることはできません。

ただし、すべてのStudentはPersonであるため、StudentオブジェクトをPersonにアップキャストすることができます。いつでも基本クラスにアップキャストできますが、派生クラスに常にダウンキャストできるとは限りません。

これがあなたにいくらかの明確さを与えることを願っています。(私もこれが完全に正しいことを願っています。)

于 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 に答える