【问题标题】:When would you create an Object from an inherited class?你什么时候从继承的类中创建一个对象?
【发布时间】:2018-06-11 16:34:50
【问题描述】:

我目前正在研究继承和多态性,我有点困惑你想在哪里创建一个 Student 类型的 Person 对象? 假设以下代码:

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Gender { get; set; }
}

class Student : Person
{
    public int YearOfStudy { get; set; }
    public string Course { get; set; }
    public string PredictedGrade { get; set; }
}

现在在网上看,这里有几个关于创建对象的选项:

Person p = new Person();
Student s = new Student();
Person ps = new Student();

第一个对象允许我设置姓名、年龄和性别,而第二个对象允许我设置这 3 个,以及 yearsOfStudy、course 和 predictGrade。但我不确定第三个对象允许我做什么?我仍然可以设置所有 6 个参数,但是我只能使用 Person 类中设置的属性吗?任何关于正确使用第三个对象的解释都将不胜感激。

谢谢

【问题讨论】:

  • 到底什么是令人困惑的部分?如果您创建一个新的Student(),您可以填充Student 的3 个属性和Person 的3 个属性。但是,除非您的变量类型为 Student,否则您将无法访问这两组属性
  • 当你创建一个新的教师类型时,力量就在于此。您将如何对教室中的每个人执行相同的操作?将它们全部转换为 Person 并迭代集合,对它们执行相同的操作(DuckAndCover()?)
  • 想想你什么时候有办法验证年龄。您的验证方法将采用Person,因为这就是所需要的。它适用于PersonStudent 以及其他任何构成Person 的东西。
  • @那个方法名,太快了……哈哈
  • 我认为问题更多的是我为什么要将继承类型的实例声明为其基类型

标签: c# inheritance polymorphism


【解决方案1】:

暂时不要认为这是Person ps = new Student()

真正的好处是能够为所有类型的Person 抽象公共代码。因此,您的方法可能会采用 Person,因为这就是它所需要的,并且可以与您创建的任何类型的人一起使用,例如 JanitorTeacher 等。

var myStudent = new Student()

VerifyAge(myStudent);
VerifyYearOfStudy(myStudent);

public bool VerifyAge(Person person)
{
    return person.Age < 200;
}

public bool VerifyYearOfStudy(Student student)
{
    return student.YearOfStudy <= DateTime.Now.Year;
}

为了澄清一些混淆,你唯一真正在方法中声明基类的时候是你想要真正表示这个变量只打算用作那个特定的类型。把它想象成你已经使用接口声明了你的变量。当然,我正在使用Student 实例,但我只是将它作为Person 实例或IPerson 使用。

通常作为方法中的变量,您不会这样做,因为事实上的标准几乎是对现在的所有内容都使用var。您选择定义Person 的位置通常是在属性、方法返回值和方法参数上。局部变量并不重要。

【讨论】:

  • 打败了我,我得到了几乎完全相同的答案..(老师和看门人)
  • @KyleB 抱歉,哈哈。如果您的答案更好,请发布! xD
  • 但运维人员不会质疑为什么你会使用 Person ps = New Student(); 在这种情况下 VerifyYearOfStudy() 不起作用。
  • @CharlesMay 我认为这是因为它可以做到这一点而引起的混乱。这就是为什么我把它作为一个论据来展示而不是为了说明。除了工厂类,我不知道为什么有人会真正写那行,除非它是一个本地方法并且你只使用基本属性。
  • 感谢那里的回复。我的理解是我总是使用Student s = new Student();var student = new Student(); 来创建一个新学生(或任何其他可以从Person 继承的类,例如'Teacher'),但我已经看到第三个选项用于示例,所以我只是想检查一下它是否有用,因为我仅限于获取“人员”数据
【解决方案2】:

因为Student 类派生自Person 类,所以任何Student 对象也是Person 对象。因此,符号Person ps = new Student(); 意味着我们将变量ps 声明为Person 类型并将其实例化为Student。如果您有一个将Person 对象作为参数的方法,则可以使用它,例如

 public void Foo(Person p) { if(p.Age > 21) Console.WriteLine("OK to drink!"); }

但是,如果您有一个对派生类的属性进行操作的方法,您必须声明并实例化它的实例。所以对于

public void Foo(Student s) {if(s.YearOfStudy == 1) Console.WriteLine("Freshman");}

你必须使用Student s = new Student();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2018-10-06
    • 2011-01-15
    • 2019-04-21
    • 2019-09-24
    相关资源
    最近更新 更多