【问题标题】:Accessing Methods and Properties of an Inherited Class in C#在 C# 中访问继承类的方法和属性
【发布时间】: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


【解决方案1】:

为什么我可以看到不属于Student 类的属性的值?

因为调试器会查看对象的实际类型(在本例中为Person)以及与该类型关联的所有属性等。

为什么我无法访问方法?

因为变量 的类型是Student,所以您只能访问Student 的成员。如果你想访问不同类型的成员(例如Person),你必须cast告诉编译器“把这个引用当作引用一个Person”。如果Student 在运行时不是真正的Person,你会得到一个异常。

【讨论】:

  • 我知道我们无法访问 Person 的方法的原因,但我的问题是当我们无法访问 Person 的方法时,为什么我们只能访问当类Context中方法的参数是Student类型时的人
  • 我很困惑 - 你可以在调试器中访问PersonStudent 的属性。调试器可以在运行时查看对象的实际类型,这是编译器无法做到的。
  • 好的,这就是我在调试时可以看到类 Person 的属性值的原因。我现在明白了
【解决方案2】:

你的继承权被翻转了。只需按如下方式更改您的课程:

class Person {
    public string Address { get; set; }
    public void GetGun() { }
}
class Student : Person {
    public string Name { get; set; }
    public int RollID { get; set; }
    public void GetPaint() { }
}

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2021-11-12
    • 2013-09-27
    • 2019-10-21
    • 2012-01-05
    • 1970-01-01
    • 2021-06-29
    • 2014-11-10
    • 2015-05-08
    相关资源
    最近更新 更多