using System;
using System.Collections.Generic;
using System.Text;namespace ConsoleApplicationTestNewOverride
{
    class Program
    {
        static void Main(string[] args)
        {
            Food f = new Food();
            f.OutputName();
            f.OutputSubClass();            Apple a = new Apple();
            a.OutputName();
            a.OutputSubClass();            Console.ReadKey(true);
        }
    }    public class Food
    {
        public virtual void OutputName()
        {
            Console.WriteLine("The name is Food.");
        }        public void OutputSubClass()
        {
            Console.WriteLine("I have no subclass.");
        }
    }    public class Apple : Food
    {
        public override void OutputName()
        {
            Console.WriteLine("The name is Apple.");
        }        public new void OutputSubClass()
        {
            Console.WriteLine("My supterclass is Food and I don't have a subclass.");
        }
    }
}输出结果为:
The name is Food.
I have no subclass.
The name is Apple.
My supterclass is Food and I don't have a subclass.
从输出结果来看,用new方法对基类方法稳藏与基类采用virtual方法没有什么不同啊!它们各自的用途是什么?

解决方案 »

  1.   

    重写(OverRide):继承发生时,在子类中重新定义父类中的方法,子类的方法和父类的方法是一样的
    隐藏(new):基类方法不做声明(默认为非虚方法),在派生类中使用new声明此方法的隐藏
    重写访问父类子类都调用子类的重写方法,隐藏时,访问父类则调用父类的方法,子类调用子类的方法
      

  2.   

    改了一下代码,有些明白了,看看这个调试思路对不对?
    using System;
    using System.Collections.Generic;
    using System.Text;namespace ConsoleApplicationTestNewOverride
    {
        class Program
        {
            static void Main(string[] args)
            {
                Food f = new Food();
                f.OutputName();
                f.OutputSubClass();            Apple a = new Apple();
                a.OutputName();
                a.OutputSubClass();            Food g = new Apple();
                g.OutputName();
                g.OutputSubClass();            Console.ReadKey(true);
            }
        }    public class Food
        {
            public virtual void OutputName()
            {
                Console.WriteLine("The name is Food.");
            }        public void OutputSubClass()
            {
                Console.WriteLine("I have no subclass.");
            }
        }    public class Apple : Food
        {
            public override void OutputName()
            {
                Console.WriteLine("The name is Apple.");
            }        public new void OutputSubClass()
            {
                Console.WriteLine("My supterclass is Food and I don't have a subclass.");
            }
        }
    }输出:
    The name is Food.
    I have no subclass.
    The name is Apple.
    My supterclass is Food and I don't have a subclass.
    The name is Apple.
    I have no subclass.
    可不可以这么解释:用虚函数的方法是在子类中彻底消灭父类中的同名函数,而隐藏(new)实际上是在子类中又创造了一个新的函数,父类中的这个同名函数只不过是被隐藏起来了,当类的实体是子类时,就用子类的,当实体是父类时,就用父类的!这样理解对吧?
      

  3.   

    可不可以这么解释:用虚函数的方法是在子类中彻底消灭父类中的同名函数,而隐藏(new)实际上是在子类中又创造了一个新的函数,父类中的这个同名函数只不过是被隐藏起来了,当类的引用是子类时,就用子类的,当类的引用是父类时,就用父类的!这样理解对吧?