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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 9881008杜鹏 黑马帝   /  2011-11-27 15:25  /  2841 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 9881008杜鹏 于 2011-11-27 15:31 编辑

abstract class Person
    {
        public Person(string name, string address, string holiday)
        {
            this.name = name;
            this.address = address;
            this.holiday = holiday;
        }
        protected string name;
        protected string address;
        protected string holiday;
        public string Name {set;get;}
        public string Address { set; get; }
        public string Holiday { set; get; }
      public   abstract void SayHello();
      public void Hello()
      {
          Console.WriteLine("Hello everyone !");
      }
      public virtual void HappyHoliday()
      {
          Console.WriteLine("这是我们的传统节日,这一天...");
      }
    }
class ChinesePerson: Person
    {
        public ChinesePerson(string name, string address, string holiday)
            : base(name, address, holiday)
        {
            Console.WriteLine("我是来至:{0} 的 {1},我们的传统节日是:{2}",address,name,holiday);
        }
        public override void SayHello()  //重写父类的抽象方法
        {
            Console.WriteLine("大家好,我是来自中国的萧逸,欢迎指教!");
        }
        public new void Hello()  //重写(覆盖)父类的Hello方法New:隐藏。
        {
            Console.WriteLine("{0}是我们的传统节日,每年的这段时间是世界人将面临一次大迁徙!\n 他们不远千里奔袭一个地方:家!",holiday );
        }
        public override void HappyHoliday()  //重写虚方法
        {
            Console.WriteLine("{0}祝大家{1}快乐喔,O(∩_∩)O哈哈~",name  ,holiday );
        }
    }
static void Main(string[] args)
        {
            Person chineseperson = new ChinesePerson("萧逸","中国","春节");
            chineseperson.Hello();            chineseperson.SayHello();
            ChinesePerson chinese = new ChinesePerson("萧逸", "中国", "春节");
            chinese.Hello();
            chineseperson.HappyHoliday();
            Console.ReadKey();
        }
为什么chineseperson.Hello();   不能调用在子类中的Hello()方法???

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

3 个回复

倒序浏览
王伟 黑马帝 2011-11-27 16:14:43
沙发
抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写;虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

回复 使用道具 举报
为什么chineseperson.Hello();   不能调用在子类中的Hello()方法???
不太明白楼主要表达的意思啊……
原因可能有两种:一、子类使用了new关键字屏蔽父类的方法,则调用谁的方法由“定义时的类型决定”;二、子类使用override关键字重写父类方法,则调用谁的方法由”运行时引用真实的对象决定。

评分

参与人数 1技术分 +1 收起 理由
朱勋 + 1

查看全部评分

回复 使用道具 举报
1. 虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项 抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化
2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写 虚方法不是 也不必要重写。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。
3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。抽象方法不能声明方法实体 而虚方法可以
包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化!

评分

参与人数 1技术分 +1 收起 理由
李荣壮 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马