2011-07-10 96 views
1

我有2個接口,同樣的方法,C#:接口:2個接口

public interface I1 
    { 
     string GetRandomString(); 
    } 

    public interface I2 
    { 
     string GetRandomString(); 
    } 

,並在一個班,我已經植入兩個,

public class ClassA : I1, I2 
    { 

     string I1.GetRandomString() 
     { 
     return "GetReport I1"; 
     } 

     string I2.GetRandomString() 
     { 
      return "GetReport I1"; 
     } 

    } 

現在主要方法我想訪問這些接口的方法,但不能

static void Main(string[] args) 
    { 
     var objClassA = new ClassA(); 
     objClassA.GetRandomString(); // not able to do this, comile time error ... 
    } 

我知道,我缺少一些基本的東西OOPS,只是想知道。 任何幫助?

回答

2

如果您有時想要使用一個接口,有時需要使用另一個接口,則可能需要對其中一個接口使用一個接口。如果你控制了類型,並且可以直接使用其中一個接口函數而不是明確的實現,那麼這將避免在該類型上進行強制轉換的需求。爲了避免強制轉換任何一種功能,您應該在對象內使用不同的名稱。因爲在C#中實現anyInterface的任何方法。Boz必須被稱爲Boz,最好的辦法可能是讓IFoo.Boz和IBar.Boz的實現只需調用名爲FooBoz和BarBoz的公共方法,然後可以直接調用它,而不會出現歧義。

雖然轉換爲接口對於類來說價格便宜,但對於結構來說它可能很昂貴。這種成本有可能在一些情況下,通過使用靜態方法像下面來避免:

 
    public interface AliceFoo { void foo();}; 
    public interface BobFoo { void foo();}; 
    static void do_alice_foo<T>(ref T it) where T:AliceFoo 
    { 
     it.foo(); 
    } 
    static void do_bob_foo<T>(ref T it) where T : BobFoo 
    { 
     it.foo(); 
    } 

這種方法允許不必強制轉換到任何使用,也可以「富」方法。

2

您應該將您的對象轉換爲特定的接口類型。

static void Main(string[] args) 
{ 
    var objClassA = new ClassA(); 

    I1 objClassAThreatedAsI1Interface = (I1)objClassA; 
    objClassAThreatedAsI1Interface.GetRandomString(); 

    I2 objClassAThreatedAsI2Interface = (I2)objClassA; 
    objClassAThreatedAsI2Interface.GetRandomString(); 
} 
0

將您的兩個GetRandomString方法標記爲ClassA中的public方法。如果您不提供訪問修飾符,則默認爲私有。

+2

您不能使用訪問修飾符來實現顯式接口。對於具有相同簽名方法的兩個不同接口使用隱式實現是不可能的,否則相同的實現將用於兩個接口。 – oxilumin

+0

顯式接口聲明不能公開。 – mrydengren

4

問題是這些函數不是MyClass的成員函數,因爲它們是定義的,而I1.GetRandomString是I2.GetRandomString。你只能叫他們在接口之一:

I1 objClassA = new ClassA(); 
    objClassA.GetRandomString(); 

I2 objClassA = new ClassA(); 
    objClassA.GetRandomString(); 
0

您需要將對象轉換爲它定義您要調用該方法的版本的界面。

如果您只想在您的類中定義單個版本的方法,請刪除接口的顯式定義(換句話說,從函數的第一個定義和整個I2。*方法中刪除I1。完全)

3

您可以將對象轉換爲您需要的接口類型,然後調用該方法。

if (objClassA is I1) 
{ 
    ((I1)objClassA).GetRandomString(); 
} 
if (objClassA is I2) 
{ 
    ((I2)objClassA).GetRandomString(); 
} 
1

您已明確實現接口。所以方法實現屬於接口,而不是你定義的類型。就編譯器而言,該方法對於該類型不存在。

您需要將您的實例明確地轉換到您要調用的接口並調用該方法(如其他人所示)。

或者更好的是,選擇其中一個接口作爲「主」接口並省略顯式實現。

public class ClassA : I1, I2 
{ 
    // make I1's implementation the "main" one 
    public string GetRandomString() 
    { 
     return "GetReport I1"; 
    } 

    // I2's implementation could only be called via a reference to an I2 
    string I2.GetRandomString() 
    { 
     return "GetReport I2"; 
    } 

} 

可替換地,只使用一個單一的實施方法(和離開了明確的實施方式)。