黑马程序员技术交流社区

标题: 抽象方法、虚方法、覆盖的区别 [打印本页]

作者: 9881008杜鹏    时间: 2011-11-27 15:25
标题: 抽象方法、虚方法、覆盖的区别
本帖最后由 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()方法???
作者: 王伟    时间: 2011-11-27 16:14
抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写;虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。

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

作者: 唐煜婷    时间: 2011-11-29 14:04
1. 虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项 抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化
2. 抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写 虚方法不是 也不必要重写。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。
3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。抽象方法不能声明方法实体 而虚方法可以
包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2