【发布时间】:2016-11-23 17:04:52
【问题描述】:
假设我有一个像这样的基类和派生类
class Student {
public string Name { get; set; }
public int RollID { get; set; }
public void GetPaint() { }
}
class Person : Student {
public string Address { get; set; }
public void GetGun() { }
}
class Content {
public void method(Student student) {
Student _student = student;
Person _person = (Person)student;
}
}
class Client
{
static void Main()
{
new Content().method(new Person() { Name="foo",RollID=1});
}
}
现在在这段代码中,当 Debug 并将鼠标悬停在 Content Class 中 Method 的参数上时,我可以看到 Student 和 Person 类的所有属性
但是当我尝试访问该方法时,我只能访问 Student 类的方法。我必须将其转换为 Person 才能访问 Person 类的方法。 我的问题是我如何能够查看和检索 Student 类的属性值,该类是 Person 类的派生类。为什么我可以看到不属于 Student 类的财产的价值?以及为什么我无法访问方法。请解释一下,我缺少一些概念吗?
【问题讨论】:
-
从逻辑上讲,Student 应该从 Person 派生而不是反过来。您的逻辑假设每个人都是学生,但事实并非如此。
-
Student 不是派生类而是基类,Person 在这种情况下是派生类
-
@NetUser101 class Person 将只有 Student 的详细信息。因此,当您提取学生的详细信息时,您将只获得该学生的详细信息,而不是他的个人详细信息
-
你告诉编译器这个对象是一个学生。它无法知道它实际上是一个人。调试器告诉您,您使用了秘密知识,这是编译器无法做到的。如果它不是实际上是一个 Person 而是一个 Student 对象,那么你的程序就会像一堆砖头一样崩溃。这就是为什么像这样的向下转型是一个坏主意,而是使用 virtual 关键字来支持多态性。
-
@HansPassant 我只是想学习框架的机制
标签: c# inheritance methods properties