public interface Iaa
    {
        void show();
    }
    class ba //基类
    {
        public void show()
        {
            Console.WriteLine("ba.show");
        }
    }    class de : ba,Iaa //子类
    {
        new public void show()
        {
            Console.WriteLine("de.show");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            b = new de();
            b.show();   //为什么显示 ba.show
            ((Iaa)b).show(); //为什么显示de.show
            Console.Read();
        }
    }

解决方案 »

  1.   

    b = new de();   这个b会有两个实际的show
    b.show(); //为什么显示 ba.show   因为de的show是new的,而不是override,所以用ba类型变量(尽管实际上是de类型),调用show,就会调用ba的show
    ((Iaa)b).show(); //为什么显示de.show  de是iaa的实现,而ba不是,所以Iaa类型变量调用的是de实现的show
      

  2.   

    请问b是什么类型,你这里没有定义呀。定义成ba b 和 de b 是不一样了。
      

  3.   

    public interface Iaa
        {
            void show();
        }
        class ba //基类
        {
            public void show()
            {
                Console.WriteLine("ba.show");
            }
        }    class de : ba,Iaa //子类
        {
            new public void show()
            {
                Console.WriteLine("de.show");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                ba b = new ba();
                b = new de();
                b.show();   //为什么显示 ba.show
                ((Iaa)b).show(); //为什么显示de.show
                Console.Read();
            }
        }
      

  4.   

    在Main方法中 b=new de();要指定b的类型. 
    如果指定为de b = new de(); 则调用de.show()结果就是de.show
    如果指定为da b = new de(); 则调用基类da.show()结果就是da.show
    ((Iaa)b).show() 只调用实现接口的类(de)中的show() 结果就是 de.show
      

  5.   

    new 和override 后 有什么区别?
      

  6.   

    ba.show没有用virtual修饰,在子类de中则只能用new,不能用override,不用new运行效果一样,只是编译时会有警告。
    如果对vritual方法在子类中用override重写,则不论你定义的变量是哪个父类,调用的都是最后override过的实现。
      

  7.   

    ba b = new ba();
                b = new de();
                b.show();   //为什么显示 ba.show
    不理解为什么会显示ba.show
    盼高手~~~~~~~~~~~~~~~~`
      

  8.   

    public interface Iaa
        {
            void show();
        }
        class ba //基类
        {
            public void show()
            {
                Console.WriteLine("ba.show");
            }
        }    class de : ba,Iaa //子类
        {
            new public void show()
            {
                Console.WriteLine("de.show");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                b = new de();
                b.show();   //为什么显示 ba.show
                ((Iaa)b).show(); //为什么显示de.show
                Console.Read();
            }
        }
    class de : ba,Iaa //子类
    本来这样写是不能编译通过的,应为de中没有实现接口Iaa的Show()方法
    但是这里恰好由于de还继承了ba,而ba中恰好有Show()的函数
    名字和需要实现接口的方法相同(好多巧合哦-_-"但是巧合后面隐藏着必然吗)这里其实做了这样的操作让基类ba的Show()作为了接口Iaa的Show()的实现
    也就是说当我们采用基类的引用或者接口的引用那么指向的函数都是ba.Show()函数
    因此:
    ((Iaa)b).show(); //为什么显示de.show--------所以显示ba.show但是这里又由于使用new关键字,所有当我们使用de的引用去访问Show()函数的时候
    函数指向的不再是基类中ba的方法了,而是自己new的方法Show()
    因此:
    b.show();   //为什么显示 ba.show -----------所以显示de.show太多的巧合了!
    -------------------------------------不知道对不对,只是分析没有执行-- -_-" -
      

  9.   

    FT!
    执行结果是
    de.show
    de.show我理解错了
    ===========================================================================
    class de : ba,Iaa //子类
    本来这样写是不能编译通过的,应为de中没有实现接口Iaa的Show()方法
    但是这里恰好由于de还继承了ba,而ba中恰好有Show()的函数
    名字和需要实现接口的方法相同
    ============================================================================
    这样编译也不会出错
    class de : Iaa //子类
        {
            new public void show()
            {
                Console.WriteLine("de.show");
            }
        }===========================================================================
    这里其实做了这样的操作让基类ba的Show()作为了接口Iaa的Show()的实现
    也就是说当我们采用基类的引用或者接口的引用那么指向的函数都是ba.Show()函数
    因此:
    ((Iaa)b).show(); //为什么显示de.show--------所以显示ba.show
    ===========================================================================最终还是把de中的new public Show()作为接口实现
      

  10.   

    仔细想了一下:你这句话有问题
    b = new de();
    这句话有问题
    de b = new de();----------------显示de.show
    da b = new de();----------------显示ba.show总结:
    关键在于
    1.什么引用去"调用"方法
    2.什么作为了接口的实现
      

  11.   

    da b = new de();----------------显示ba.show
    为什么?
      

  12.   

    其实在子类里用new是在你不知道父类有此方法的情况下用,如果你知道父类有此方法,你如果在子类不想override你大可以取其他名字。
      

  13.   

    da b = new de();----------------显示ba.show
    为什么?
      

  14.   

    因为de继承了接口 所以
    ((Iaa)b).show(); // 调用自己de.show如果
    ba b = new de(); //b 仍为基类
    b.show(); //调用 基类的 ba.show
    ((de)b).show(); //才会调用de.show
      

  15.   

    声明的是基类da b 当然首先调用基类的方法啦 不管你是什么运行时类型da的show方法未声明为abstract或virtual 所以de的show方法与da的show方法没有override关系((Iaa)b).show(); 
    b的实际类型de继承自Iaa接口,在编译时实现了转换,所以运行时b就是de类型
      

  16.   

    da b = new de();----------------显示ba.show
    为什么?我这样理解:1.方法是属于类的
    2.对象是通过类去访问方法的
    3.每个类中存在一张所有方法的引用表+父类的virtual,abstract方法引用表
    4.如果在自己的方法表中没有找到方法引用,那么会去到父类中去寻找
    5.new的关键字会再子类方法表中创建一个新方法
    6.override的关键字会改写父类virtual,abstract方法表使其指向子类中的方法(即使采用父类访问也访问到子类中override的方法)
    7.父类对象的引用是可以指向子类对象的,但采用的是父类的方法表ba b = new de();
    我们使用的方法表是ba的方法表,那么找到的方法就是ba中的方法ba.show
    同样:
    如果ba中virtual show,de中new show() --------------------- ba.show()
    如果ba中virtual show,de中override show() -----------------de.show()
    如果ba中show,de中new show() ------------------------------ba.show()(我们这种情况)
    如果ba中show,de中override show() -------------------------编译不通过-------------------------------------------思维混乱中,高手指正--------- -_-" ----
      

  17.   

    我理解:因为ba中的show方法没有声明为virtual,所以声明为ba类型的b对象,调用就是自己的show实现。
    接口那个必然会调用实现该接口的类的show方法。
      

  18.   

    da的show方法声明为abstract或virtual 
    de的show方法override
    这时是调用的show方法是动态的 是运行时类型的方法