using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 练习20
{
public enum gender
{ 男,女}
class Program
{
static void Main(string[] args)
{
person p1 = new person();
p1.SayHi();
person p2 = new Employee();
p2.SayHi();
Employee p3 = new Employee();
p3.SayHi();
Console.ReadKey();
}
}
class person
{
string name;
public string Name
{
get { return name; }
set { name = value; }
}
gender sex;
public gender Sex
{
get { return sex; }
set { sex = value; }
}
int age;
public int Age
{
get { return age; }
set { age = value; }
}
public virtual void SayHi()
{
Console.WriteLine("hello!");
}
}
class Employee : person
{
decimal salary;
public decimal Salary
{
get { return Salary; }
set { Salary = value; }
}
public override void SayHi()
{
Console.WriteLine("员工说hello");
}
public void SaySorry()
{
Console.WriteLine("sorry!");
}
}
}
以上是创建了一个父类person,一个子类Employee。
person p1 = new person();
p1.SayHi();
p1调用的是父类方法没问题。
Employee p3 = new Employee();
p3.SayHi();
p3调用子类重写后的方法,也没问题。
person p2 = new Employee();
p2.SayHi();
这样运行结果表示p2也是调用子类重写后的方法,那么为什么p2,没有办法调用子类中特有的方法和属性,比如SaySorry()和decimal salary。
是不是因为这样写:person p2 = new Employee();调用的是父类的构造方法,并且子类中没有重载构造方法,所以不能访问子类特有的方法和属性?
作者: 向晓伟 时间: 2014-7-21 12:32
(p2 as Employee).SaySorry作者: _xixi_ 时间: 2014-7-21 12:48
person p2 = new Employee(); p2是Person 变量,指向 Employee 类的一个对象,Employee 继承自Person,那么Person 有的(非私有成员),Employee 都有;但是 p2 这个字段 已经限定为 Person 变量了,只能访问到 Employee 对象里面继承自 Person 的成员,所以不能访问到 SaySorry() 和 salary,除非,把 p2 又强制转换一下: Employee p3=(Employee) p2;
p2能访问子类重写的 SayHi() ,是因为当p2.SayHi(),会访问 Employee 对象里面继承自 Person 的 SayHi(),这个方法用 virtual 关键字修饰,也就是告诉 p2 要到子类对象(这里是Employee的一个对象)里面找相应的重写方法,如果找不到,会继续向子类的父类里面寻找,如果这里没有重写,那么就是调用 Person 的 SayHi()了作者: qsq0000hm 时间: 2014-7-21 13:30
_xixi_ 发表于 2014-7-21 12:48
person p2 = new Employee(); p2是Person 变量,指向 Employee 类的一个对象,Employee 继承自Person,那 ...