2015-01-06 90 views
3

我有兩個接口A,B都有相同的方法聲明。我有一個從接口A,B繼承的類C.我有另一個類d從C繼承現在我想訪問實現的方法用C從d如何從子類訪問派生類中實現的接口方法?

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中的方法?

+2

順便說一句,如果你使用傳統的名稱 - 接口的'I'前綴,方法的PascalCase等,我的問題會更好。我知道它們只是示例名稱,但遵循約定減少了認知負載。 –

回答

7

如何從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。如果您實現了其中一個接口隱式地,那麼您可以直接調用這些方法,但是顯式接口實現只允許通過該接口調用成員。

3

顯式接口方法調用應始終工作

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

,因爲你必須指定由您要使用的方法的界面,您可以使用此代碼(A或B):

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

正如其他人已經建議,鑄造當然是這樣做的一種方法。它快速簡單,但如果你打算使用它很多煩人的。出路在這種情況下,是賦予訪問由界面和方便從而將它們簡化了它們的使用提供的成員屬性:

無需額外的鑄造(你的財產的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); 
    } 
} 
0

您可以檢查此,

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

相關問題