interface IControl
{
    void Paint();
}
class Control : IControl
{
    public  void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
    new public  void Paint() { Console.WriteLine("TextBox"); }
}class App
{
    static void Main()
    {
        Control c = new Control();
        TextBox t = new TextBox();
        IControl ic = c;
        IControl it = t;
        c.Paint();
        t.Paint();
        ic.Paint();
        it.Paint();      //为什么调用Control类的Paint方法
    }
}interface IControl
{
    void Paint();
}
class Control : IControl
{
    public  void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
    new public  void Paint() { Console.WriteLine("TextBox"); }
}class App
{
    static void Main()
    {
        Control c = new Control();
        TextBox t = new TextBox();
        IControl ic = c;
        IControl it = t;
        c.Paint();
        t.Paint();
        ic.Paint();
        it.Paint();      //为什么调用Control类的Paint方法
    }
}
interface IControl
{
    void Paint();
}
class Control : IControl
{
    public  virtual void Paint() { Console.WriteLine("Control"); }
}
class TextBox : Control
{
    override public  void Paint() { Console.WriteLine("TextBox"); }
}class App
{
    static void Main()
    {
        Control c = new Control();
        TextBox t = new TextBox();
        IControl ic = c;
        IControl it = t;
        c.Paint();
        t.Paint();
        ic.Paint();
        it.Paint();                  //为什么调用TextBox类中的Paint方法
    }
}========================================================================
应该怎么进行分析呢

解决方案 »

  1.   

    因为方法先于对象存在, 而且方法的顺序是先父类再了类.
    new 时, 有二个相同的Paint(), 接口才不管你是谁的,它顺序查找,有就执行
    override 是对Paint的完全重写,所以方法表里只有一个Paint
      

  2.   

    class TextBox : Control 

        new public  void Paint() { Console.WriteLine("TextBox"); } 

      

  3.   

    因为方法先于对象存在, 而且方法的顺序是先父类再了类. 
    new 时, 有二个相同的Paint(), 接口才不管你是谁的,它顺序查找,有就执行 
    override 是对Paint的完全重写,所以方法表里只有一个Paint
    -------------------------------------------------------------------
    还是没明白, 
      

  4.   

    第一个程序, 都是在内存里的方法指针
    IPain()     //   Control 
    IPain()     //   TextBox 第二个程序  
    IPain()    //完全重写了, 所在方法列表里只有一个
      

  5.   

    interface IControl 

        void Paint(); 

    class Control : IControl 

        public  void Paint() { Console.WriteLine("Control"); } 

    class TextBox : Control 

        new public  void Paint() { Console.WriteLine("TextBox"); } 
    } class App 

        static void Main() 
        { 
            Control c = new Control(); 
            TextBox t = new TextBox(); 
            IControl ic = c; 
            IControl it = t; 
            c.Paint(); 
            t.Paint(); 
            ic.Paint(); 
            it.Paint();      
    //为什么调用Control类的Paint方法 
    //因为it指向一个new TextBox() 而在TextBox类中的paint方法是用new修饰符,简单的说就是没实现多态
        } 
    }
      

  6.   

    interface IControl 

        void Paint(); 

    class Control : IControl 

        public  virtual void Paint() { Console.WriteLine("Control"); } 

    class TextBox : Control 

        override public  void Paint() { Console.WriteLine("TextBox"); } 
    } class App 

        static void Main() 
        { 
            Control c = new Control(); 
            TextBox t = new TextBox(); 
            IControl ic = c; 
            IControl it = t; 
            c.Paint(); 
            t.Paint(); 
            ic.Paint(); 
            it.Paint();                  
    //为什么调用TextBox类中的Paint方法 
    //override代表对父类方法的重写,简单地说,实现了多态
        } 
      

  7.   

    使用 new 会用同样的名称创建一个新成员并使原始成员变为隐藏的,而 override 则扩展继承成员的实现。new 时,it.Paint();  即为调用IControl 在control类中的实现方法Paint(),因为这个方法在control类的实例里是存在的,只是在其的后继类中为隐藏;
    override时,TextBox 对control类的Paint()方法进行了重写,所以就调用TextBox类中的Paint方法
      

  8.   

    怎么贴了两次,前面的是错误的吧 it.Paint();                  //为什么调用TextBox类中的Paint方法 这就是多态,更多的你去看书吧,看看多态的解释,我记得《C++编程思想》这本书解释得比较清楚,我就不解释了,可能会把你绕得更糊涂。别问为什么是c++,面向对象的编程都是一样的。
      

  9.   

        interface IControl
        {
            void Paint();
        }
        class Control : IControl
        {
            public void Paint() { Console.WriteLine("Control"); }
        }
        class TextBox : Control
        {
            new public void Paint() { Console.WriteLine("TextBox"); }
        }    class myCtrl : TextBox
        {
            public void myPaint() { Console.WriteLine("myCtrl"); }
        }
        class App
        {
            static void Main()
            {
                Control c = new Control();
                TextBox t = new TextBox();
                myCtrl my = new myCtrl();
                IControl ic = (IControl)c;
                IControl it = (IControl)t;
                IControl imy = (IControl)my;
                c.Paint();
                t.Paint();
                my.Paint();  //这里执行TextBox类的Paint()
                ic.Paint();
                it.Paint(); //为什么调用Control类的Paint方法 
                imy.Paint();
            }
        } 为说明问题,特加myCtrl类,它从TextBox类继承
    我们看TextBox类的Paint()用new定义,它隐藏了Control类的Paint(),这样Control类的Paint()对TextBox类及继承于TextBox类的子类来说是不可见的,
    或者说是不可用的.(从my.Paint()可知) 而TextBox类的Paint()对其父类来说也是不可见的.
    注意ic,it,imy的类型定义为IControl,换句话说就是接口类型的对象变量,这里实际上是将子类转换成其父类类型,
    那么对IControl来说,可见的只有Control类的Paint(), 仔细看加色部分,就会明白的
      

  10.   

    记住,方法用override修饰就用自身的,new修饰,就用父类的....个人理解
      

  11.   

    new就是一个新方法,其实就是个另外一个方法,但是你硬要给它叫这个名字而已,所以跟基类的那个Paint一点关系都没有