面向对象之父类变量指向子类实例对象分析
父类
public class person { public static string markup; static person() { markup = "markup"; } //无参数构造函数 //public person() //{ // Console.WriteLine("调用person构造函数"); //} public person(int parage, string paraname, string parahobby) { age = parage; name = paraname; hobby = parahobby; } private string name; public string Name { get { return name; } set { name = value; } } private int age; public int Age { get { return age; } set { age = value; } } private string hobby; public string Hobby { get; set; } public void SayHi() { Console.WriteLine("Person SayHi Method"); } }
子类
public class Student:person { public string No; //调用无参构造函数,同时调用有参数构造函数的方式 public Student():base(123,"sdf","sd") { Console.WriteLine("调用Student的无参数构造函数"); } public Student(string s):this() { Console.WriteLine("调用Student的有参数构造函数"); } public void SayHi() { Console.WriteLine("大家好,我是{0},{1},{2}", this.Name, this.Age, this.Hobby); } }
person stu = new Student("ss");
1、父类变量可以指向子类的实例对象,反之则不可以。
2、当创建一个子类对象时,如果是它的父类变量接收的它的子类对象,那么它只能调用父类的成员;(此过程中,此父类变量指向了父类成员,并没有指向这个子类成员);
3、例外情况:通过重写(override),父类变量可以调用子类的重写方法;
4、子类继承父类的所有成员,但是只能访问父类的非私有成员;
Student onestu = new Student("ss");
1、当创建一个子类对象时,如果声明的变量也是子类类型;调用时,首先查找子类中是否有该成员,有则调用;如果没有,到它的父类中寻找,有则调用
person stu = new Student("ss");
Student onestu = (Student)stu;
onestu.SayHi();
1、强制类型转换成子类,重新指向子类的实例对象