定义一个接口MyInterface, 然后父类MyBaseClass继承这个接口,子类MyClass继承MyBaseClass
    public interface MyInterface
    {
        void show();
    }    public class MyBaseClass : MyInterface
    {
        public void show()
        {
            Console.WriteLine("BaseClass");
        }
    }    public class MyClass : MyBaseClass
    {
        public new void show()
        {
            Console.WriteLine("ChildClass");
        }
    }
客户端代码:
    class Program
    {
        static void Main(string[] args)
        {
            MyInterface mi = new MyClass();
            mi.show();
        }
    }
根据多态性,这里mi为什么会调用父类MyBaseClass的show方法而不是子类MyClass的show方法??求详细的解答,谢谢!

解决方案 »

  1.   

    MyInterface mi = new MyClass();既然New了就会到父类的构造函数中,现在出来的是父类的实例吧,当然调用它的方法。个人看法,等高手
      

  2.   


    MyInterface mi = new MyClass();
    虽然是实例化了父类,但这里应该是先执行父类的构造函数MyBaseClass.MyBaseClass(),再执行子类的构造函数MyClass.MyClass(),然后该如何解释呢?
      

  3.   

    问题的关键在,你在MyClass 中用到了New,去查查Newde 用法
    你如果改这样,效果不一样了
     class Program
        {
            static void Main(string[] args)
            {
                Samtest st = new SamCls();
                st.Show("Sam");
                st = new SamCls2();
                st.Show("Sam");            SamCls2 st2 = new SamCls2();
                st2.Show("Kevin");
                SamCls st3 = new SamCls2();
                st3.Show("Kevin");
                Console.ReadLine();
            }
        }
        public interface Samtest
        {
            void Show(string str);
        }    public class SamCls : Samtest
        {
            public virtual void Show(string str)
            {
                Console.WriteLine("Base:" + str);
            }
        }    public class SamCls2 : SamCls
        {
            public override void Show(string str)
            {
                Console.WriteLine("Child:" + str);
            }
        }
      

  4.   

    老问题了
    public void show()
    你父类的show方法不是虚方法,所以子类的show实际上应该写new来隐藏父类的方法。但不论如何,父类的show是隐式实现接口的show方法。
      

  5.   

    mi是接口类型MyInterface,MyBaseClass中的show方法是实现该接口的方法,所以会调用它 
      

  6.   

    因为override链被myclass中的new中断了,所以不认识你的new方法,就调用父类的方法了;
      

  7.   

    根据多态性,这里mi为什么会调用父类MyBaseClass的show方法而不是子类MyClass的show方法??求详细的解答,谢谢!//子类的show方法前面加上new关键字,代表隐藏or覆盖。也就是可以把这个方法当成是一个新的方法,与父类的show方法完全不相干。。那么这样一来子类就没重写父类的方法了。
    那么调用时,自然是调用父类自己的方法了。
      

  8.   

    因为override链被myclass中的new中断了,所以不认识你的new方法,就调用父类的方法了;
      

  9.   


    MyInterface mi = new MyClass();
    现在声明的变量是接口,这个如何解释?
      

  10.   

    new 和 override 性质不同  new 不参加多态
      

  11.   

    new 会把 父类的同名方法隐藏掉, 而override 会把父类重名的方法重写掉(父类的方法必须是虚方法)