如何从子 class 访问在派生的 class 中实现的接口方法?
How to access Interface method implemented in the derived class from child class?
我有两个接口 A,B 都有相同的方法声明。我有一个 class C 继承自接口 A、B。我有另一个从 C 继承的 class 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中的方法?
显式接口方法调用应该始终有效
((A)this).mul(1,1);
您可以使用此代码,因为您必须指定要从中使用该方法的接口(A 或 B):
((A)this).add(1, 1);
How to access the methods in C from D?
您必须使用相关接口的编译时引用。例如:
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。如果您隐式实现了其中一个接口,您可以像往常一样直接调用这些方法...但是显式接口实现只允许通过该接口调用成员。
正如其他人已经建议的那样,转换当然是一种方法。它既快速又简单,但如果你要经常使用它,那就很烦人了。在这种情况下,出路是提供对接口提供的成员的访问权限的属性,并且可以方便地 group 它们从而简化它们的使用:
无需额外转换即可轻松访问(您只需在 属性 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
-class:
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
-class:
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
A的参数化值= 22乘法值= 12
A的主要应用值= 142乘法值= 11
我有两个接口 A,B 都有相同的方法声明。我有一个 class C 继承自接口 A、B。我有另一个从 C 继承的 class 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中的方法?
显式接口方法调用应该始终有效
((A)this).mul(1,1);
您可以使用此代码,因为您必须指定要从中使用该方法的接口(A 或 B):
((A)this).add(1, 1);
How to access the methods in C from D?
您必须使用相关接口的编译时引用。例如:
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。如果您隐式实现了其中一个接口,您可以像往常一样直接调用这些方法...但是显式接口实现只允许通过该接口调用成员。
正如其他人已经建议的那样,转换当然是一种方法。它既快速又简单,但如果你要经常使用它,那就很烦人了。在这种情况下,出路是提供对接口提供的成员的访问权限的属性,并且可以方便地 group 它们从而简化它们的使用:
无需额外转换即可轻松访问(您只需在 属性 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
-class:
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
-class:
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
A的参数化值= 22乘法值= 12
A的主要应用值= 142乘法值= 11