none
以下这段是从教程下摘录的,不知道自己理解的对不对。请高人正解: RRS feed

  • 问题

  • 以下这段是从教程下摘录的,不知道自己理解的对不对。请高人正解:

    接口篇:    

         在多重继承接口中遵循直观隐藏规则,即如果成员在任何一个访问路径中被隐藏,则其在所有访问路径中都被隐藏。
        
         在下面的示例中IBase.F成员被ILeft.F成员隐藏,因此即使使在通过IRight的访问路径中IBase.F似乎没有被隐藏,
    调用d.F(1)仍选择ILeft.F。由于从IDerived经ILeft到IBase的访问路径隐藏了IBase.F,因此该成员从IDerived经IRight
    到IBase的访问路径中也被隐藏:

         interface IBase
         {
            void F(int i );
          }
         interface ILeft:IBase
         {
            new void F(int i );
          }
          interface IRight:IBase
         {
            void G( );
          }
         interface IDerived:ILeft,IRight{}
        
         class A
         {
            void Test(IDerived d)
             {
                 d.F(1);           //调用ILeft.F   因为隐藏了IBase类的F方法,所以用ILeft.F
                 ((IBase)d).F(1);  //调用IBase.F   因为强制转换成了IBase,所以用IBase.F
                 ((ILeft)d).F(1);  //调用ILeft.F  
                 ((IRight)d.)F(1)  //调用IBase.F   虽然d是IDerived接口类型(继承ILeft,IRight)
                                                   但被强制转换成了IRight接类型,而IRight中没有
                                                   所要的处理方法,从而查找IRight的基类,也就是
             }                                     IBase中的F方法了。IBase.F

    2011年9月17日 2:35

答案

  • IDerived经IRight到IBase的访问路径中被隐藏了,

    但在 ((IRight)d).F(1)中,d被转换成了IRight,这样就是以IRight类型来决定的,

    而IRight调用的是基类的F方法,所以并没有冲突。


    --!
    • 已标记为答案 zyj_keyen 2011年9月21日 23:56
    2011年9月19日 2:02

全部回复

  • 个人感觉

    因此该成员从IDerived经IRight
    到IBase的访问路径中也被隐藏:

    这段话   与  ((IRight)d.)F(1)  //调用IBase.F  有冲突,  既然被隐藏了,为什么还会被调用。

    2011年9月17日 2:37
  • IDerived经IRight到IBase的访问路径中被隐藏了,

    但在 ((IRight)d).F(1)中,d被转换成了IRight,这样就是以IRight类型来决定的,

    而IRight调用的是基类的F方法,所以并没有冲突。


    --!
    • 已标记为答案 zyj_keyen 2011年9月21日 23:56
    2011年9月19日 2:02
  • 也就是

                                                   虽然d是IDerived接口类型(继承ILeft,IRight)
                                                   但被强制转换成了IRight接类型,而IRight中没有
                                                   所要的处理方法,从而查找IRight的基类,也就是
                                                  IBase中的F方法了。IBase.F

     

    这段话的意思喽?这段是我的个人理解,不知道对不对!呵呵!

    2011年9月19日 23:40
  • 关于对不对 你可以测试结果简单明了  何必纠结这些术语呢  能通过表示正确的

    这里有个问题  当两个接口有同名方法时候 只能显声明  不能隐藏声明 在访问 只能强制转换访问


    My Blog<
    2011年9月21日 4:36
    版主