繁体   English   中英

如何从子类访问派生类中实现的接口方法?

[英]How to access Interface method implemented in the derived class from child class?

我有两个接口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中的方法?

如何从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(...));

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

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

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

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

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

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

正如其他人已经建议的那样,铸造当然是一种方法。 它既快速又简单,但如果你要使用它很烦人的话。 在这种情况下,出路是属性,可以访问接口提供的成员,并方便地对它们进行分组 ,从而简化了它们的使用:

无需额外铸造即可轻松访问(您只需在属性吸气剂中执行一次 - 请参阅下面的C级):

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);
    }
}

你能看看吗,

 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的加法值

Paremeterized值A = 22乘法值= 12

Mainapplicatin值A = 142乘法值= 11

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM