我目前正在研究继承和多态,我对你想要创建一个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类中设置的属性?任何关于正确使用第三个对象的解释都将受到赞赏。
由于
答案 0 :(得分:2)
暂不认为这是Person ps = new Student()
。
真正的好处是能够为所有类型的Person
抽象公共代码。因此,您的方法可能需要Person
,因为它只需要它,并且适用于您创建的任何类型的人,例如Janitor
,Teacher
等。
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
通常是属性,方法返回值和方法参数。局部变量并不重要。
答案 1 :(得分:1)
因为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();
。
答案 2 :(得分:-1)
第三个对象没有意义。在您的示例中,您应该只使用:
Student s = new Student();
您可以从学生和个人访问属性。
因为您还可以拥有其他继承自Person的类,例如:
public class Employee : Person
{
public decimal salary { get; set;}
}
因此,当您创建Employee实例时,您将拥有Person的属性。