A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© qsq0000hm 中级黑马   /  2014-7-21 11:31  /  1163 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 qsq0000hm 于 2014-7-21 13:29 编辑

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();调用的是父类的构造方法,并且子类中没有重载构造方法,所以不能访问子类特有的方法和属性?

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

4 个回复

倒序浏览
(p2 as Employee).SaySorry
回复 使用道具 举报
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()了

评分

参与人数 1技术分 +1 收起 理由
陈君 + 1

查看全部评分

回复 使用道具 举报
_xixi_ 发表于 2014-7-21 12:48
person p2 = new Employee();  p2是Person 变量,指向 Employee 类的一个对象,Employee 继承自Person,那 ...

说的很详细,豁然开朗
回复 使用道具 举报
路过 学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马