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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 鲍云龙 中级黑马   /  2012-6-22 12:30  /  2392 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. <P> </P>
复制代码
  1. namespace ConsoleApplication1
  2. {
  3. class Program
  4. {
  5. static void Main(string[] args)
  6. {
  7. person[] p = new person[2];
  8. chiness c = new chiness();
  9. jp j = new jp();
  10. p[0] = c;
  11. p[1] = j;
  12. c.Name = "张三";
  13. j.Name = "李四";
  14. for (int i = 0; i < p.Length; i++)
  15. {
  16. p[i].sayhi();

  17. }
  18. Console.ReadKey();
  19. }
  20. }
  21. class person
  22. {
  23. private int age;

  24. public int Age
  25. {
  26. get { return age; }
  27. set { age = value; }
  28. }
  29. private string name;

  30. public string Name
  31. {
  32. get { return name; }
  33. set { name = value; }
  34. }
  35. virtual public void sayhi()
  36. {
  37. Console.WriteLine("我的年龄:{0}我的姓名:{1}",this.age,this.name);
  38. }
  39. }
  40. class chiness : person
  41. {
  42. override public void sayhi()
  43. {
  44. Console.WriteLine("我是中国人我叫:{0}", Name);
  45. }
  46. }
  47. class jp : person
  48. {
  49. override public void sayhi()
  50. {
  51. Console.WriteLine("我是日本人我叫:{0}",Name);
  52. }
  53. }
  54. }
复制代码
谁给解释一下 上面的这段代码

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

9 个回复

倒序浏览
一个person类派生了一个chinese类和jp类,其中chinese类重写了父类sayhi()方法,jp类重写了父类sayhi()方法。

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1

查看全部评分

回复 使用道具 举报
namespace ConsoleApplication1              //命名空间
{
    class Program                           //主程序
    {
        static void Main(string[] args)     //主程序起始方法
         {
             person[] p = new person[2];   //声明Person数组,分配2个位置
             chiness c = new chiness();   //实例化chiness类c
             jp j = new jp();             //实例化jp类j
             p[0] = c;                     //把c放入声明的Person类的第一个位置
             p[1] = j;                     //把j放入声明的Person类的第二个位置
             c.Name = "张三";              //c的Name字段赋值“张三”
             j.Name = "李四";              //j的Name字段赋值“李四”
             for (int i = 0; i < p.Length; i++) //for循环取出p中的内容,也就是上面放入的c,j
             {
                 p[i].sayhi();                //索引形式调用sayhi()方法
             }
             Console.ReadKey();                //程序等待键入.....
         }
     }
   class person                         //声明Person父类
    {
        private int age;               //声明私有字段age
        public int Age                 // 封装age字段,此时Age 是属性
        {
        get { return age; }            //当调用Age点是取值,比如 p.Age
        set { age = value; }}            //当给Age赋值
        }
        private string name;             //同上
        public string Name
        {
        get { return name; }
        set { name = value; }
        }
        public virtual  void sayhi()    //声明sayhi()方法,病标记为虚拟,子类中可以重写
        {
        Console.WriteLine("我的年龄:{0}我的姓名:{1}",this.age,this.name);   //方法体
        }
    }
    class chiness : person          //chinese类继承person
    {
        public override  void sayhi()   //override 标志重写父类虚方法,
        {
        Console.WriteLine("我是中国人我叫:{0}", Name);  //方法体
        }
    }
    class jp : person                //jp类继承person
    {
        public override  void sayhi()   //override 标志重写父类虚方法,
        {
        Console.WriteLine("我是日本人我叫:{0}",Name);  //方法体
        }
    }
}


//希望对你有帮助

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
2楼的解释好强大.跪了.
回复 使用道具 举报
刘逍遥 发表于 2012-6-22 13:37
namespace ConsoleApplication1              //命名空间
{
    class Program                            ...

哥们辛苦了,怪我呀。没说明白,我想问的是为什么可以通过父类的sayhi()调用了 不同的对象的sayhi();
回复 使用道具 举报
本帖最后由 刘逍遥 于 2012-6-22 14:01 编辑
鲍云龙 发表于 2012-6-22 13:54
哥们辛苦了,怪我呀。没说明白,我想问的是为什么可以通过父类的sayhi()调用了 不同的对象的sayhi(); ...


你不是用override标记把父类的sayhi()方法重写了吗? 重写的意思就是:不用父类方法体,用我子类的方法体!

因为你把子类放在Person类数组后,根据循环每次取出来的是子类的实例,当然调用的是子类实例的方法

此处并不是用父类的方法去调用子类方法,而是你用循环取出的是子类的实例对象,是直接调用子类的sayhi()方法!  并不是通过父类来掉子类方法

回复 使用道具 举报
刘逍遥 发表于 2012-6-22 13:58
你不是用override标记把父类的sayhi()方法重写了吗? 重写的意思就是:不用父类方法体,用我子类的方法体 ...

楼主说的我认为不太对吧,父类只无法调用子类里重写的方法了吧,它只能调用它自身方法,子类可以调用父类的方法
回复 使用道具 举报
程艳伟 发表于 2012-6-22 19:07
楼主说的我认为不太对吧,父类只无法调用子类里重写的方法了吧,它只能调用它自身方法,子类可以调用父类 ...

如果子类重写父类方法,那么调用的是,子类方法
如果没重写,则调用父类方法
父类肯定只能调用父类方法
回复 使用道具 举报
刘逍遥 发表于 2012-6-22 19:23
如果子类重写父类方法,那么调用的是,子类方法
如果没重写,则调用父类方法
父类肯定只能调用父类方法 ...

我又研究了一下这代码。其实这就是传说中的多态
回复 使用道具 举报
鲍云龙 发表于 2012-6-22 21:16
我又研究了一下这代码。其实这就是传说中的多态


namespace 子类继承关系
{
    class Program
    {
        static void Main(string[] args)
        {
            F f=new F();  //实例化父类对象f
            S s = new S();  //实例化子类对象s
            f.Say();    //父类调用父类方法
            s.Say();    //子类调用子类方法
            f=(F)s;     
            f.Say();   //父类调用子类重写的方法
            Console.ReadKey();

        }
    }
    public class F  //定义父类
    {
        public virtual void  Say()
        {
            Console.WriteLine("我是父类");
        }
    }
    public class S:F //子类S继承于F类
    {
        public override void  Say()
        {
            Console.WriteLine("我是子类");
        }
    }
}

QQ截图20120623093804.png (4.66 KB, 下载次数: 46)

QQ截图20120623093804.png
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马