【问题标题】:How to access Interface method implemented in the derived class from child class?如何从子类访问派生类中实现的接口方法?
【发布时间】:2015-01-06 10:49:47
【问题描述】:

我有两个接口 A,B 都有相同的方法声明。我有一个从接口 A、B 继承的 C 类。我有另一个继承自 C 的 D 类。现在我想从 D 访问 C 中实现的方法

interface A
{
    int add(int x, int y);
    int mul(int x, int y);
}

interface B
{
    int add(int x, int y);
    int mul(int x, int y);
}

public class C : A,B
{
    int A.add(int x,int y)
    {
        return x + y;
    }

    int A.mul(int x,int y)
    {
        return 0;
    }

    int B.add(int x, int y)
    {
        return x;
    }

    int B.mul(int x, int y)
    {
        return y;
    }  
}


class D : C
{
}

如何从 D 访问 C 中的方法?

【问题讨论】:

  • 顺便说一句,如果您使用常规名称,您的问题会更好 - 接口使用 I 前缀,方法使用 PascalCase 等。我知道它们只是示例名称,但遵循约定会减少认知负荷。

标签: c# inheritance multiple-inheritance


【解决方案1】:

如何从 D 访问 C 中的方法?

您必须使用具有相关接口编译时的引用。例如:

class D
{
    public void FooA()
    {
        A a = this;
        Console.WriteLine(a.mul(...));
    }

    public void FooB()
    {
        B b = this;
        Console.WriteLine(b.mul(...));
    }
}

当然你不需要局部变量——你可以强制转换:

Console.WriteLine(((A) this).mul(...));

...但它变得有点难看。

这只是因为您使用的是explicit interface implementation。如果您隐式实现了其中一个接口,则可以像往常一样直接调用这些方法...但显式接口实现只允许通过该接口调用成员。

【讨论】:

    【解决方案2】:

    显式接口方法调用应该始终有效

    ((A)this).mul(1,1);
    

    【讨论】:

      【解决方案3】:

      您可以使用此代码,因为您必须指定要从中使用方法的接口(A 或 B):

      ((A)this).add(1, 1);
      

      【讨论】:

        【解决方案4】:

        正如其他人已经建议的那样,强制转换当然是这样做的一种方式。它既快速又简单,但是如果您要经常使用它,那会很烦人。在这种情况下,出路是提供对接口提供的成员的访问权限并方便地将它们分组从而简化它们的使用的属性:

        无需额外转换即可轻松访问(您只需在属性 getter 内执行一次 - 请参阅下面的 C-class):

        class Program
        {
            static void Main(string[] args)
            {
                C c = new C();
                c.As.add(1, 2);
            }
        }
        

        接口:

        public interface A
        {
            int add(int x, int y);
            int mul(int x, int y);
        }
        
        public interface B
        {
            int add(int x, int y);
            int mul(int x, int y);
        }
        

        C-类:

        public class C : A, B
        {
            // Methods from the A-interface.
            public A As { get { return (A)this; } }
        
            // Methods from the B-interface.
            public B Bs { get { return (B)this; } }
        
            int A.add(int x, int y)
            {
                return x + y;
            }
            int A.mul(int x, int y)
            {
                return 0;
            }
            int B.add(int x, int y)
            {
                return x;
            }
            int B.mul(int x, int y)
            {
                return y;
            }
        }
        

        D-类:

        public class D : C
        {
            public D()
            {
                base.As.add(1, 2);
                base.Bs.add(3, 4);
            }
        }
        

        【讨论】:

          【解决方案5】:

          你能检查一下吗,

           using System;
          
           public class Program
          {
              public static void Main()
               {
          
               D ds=new D(10,12);
          
               int valueAddtion=((A)ds).add(20,122);
          
               int valueMultiplication=((B)ds).mul(20,11);
               Console.WriteLine("Mainapplicatin Value  of A= " +valueAddtion+" multiplication value=  "+valueMultiplication);
          
              }
          }
          

          //你的代码段在这里

           class D : C
           {
            public D()
            {
           int valueAdd=((A)this).add(10,11);
           int valueMul=((B)this).mul(20,11); 
           Console.WriteLine("Addition Value  of A= " +valueAdd+" multiplication value= "+valueMul);
            }
          
          public D(int x,int y):this()
          {
           int valueAdd=((A)this).add(x,y);
           int valueMul=((B)this).mul(x,y);   
           Console.WriteLine("Paremeterized Value  of A= " +valueAdd+" multiplication value= "+valueMul);
          }
          }
          

          输出将是,

          A的加法值= 21 乘法值= 11

          A的参数化值= 22 乘法值= 12

          Mainapplicin A的值= 142 乘法值= 11

          【讨论】:

            猜你喜欢
            • 2012-03-14
            • 2018-11-03
            • 2010-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-04-28
            • 2019-08-03
            • 2018-08-09
            相关资源
            最近更新 更多