2011-07-10 15 views
1

に同じ方法Iは、アクセスしたい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"; 
     } 

    } 

の両方を注入している、ようにI 2つのインターフェースを有しています、これらのインターフェイスメソッドが、

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

にできない私は、私は、いくつかの基本的なOOPSのものをしないのですちょうどそれを知りたいと思ったことを知っています。 ヘルプ?

答えて

2

インターフェイスを使いたい場合や、時には他のインターフェイスを使用したい場合は、最後のインターフェイスを使用する必要があります。型を制御し、明示的な実装ではなく直接インタフェース関数の1つを使用できるようにすると、それをキャストする必要はありません。いずれかの関数を型キャストする必要がないようにするには、それらをオブジェクト内の別々の名前で使用できるようにする必要があります。 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(); 
    } 

このアプローチは、「foo」でいずれかの方法は何かを型キャストすることなく使用することができます。

2

オブジェクトを特定のインターフェイスタイプにキャストする必要があります。

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

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

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

ClassAで2つのGetRandomStringメソッドをpublicとしてマークします。アクセス修飾子を指定しないと、デフォルトでprivateになります。

+2

明示的なインターフェイスの実装にアクセス修飾子を使用することはできません。同じシグネチャメソッドを持つ2つの異なるインターフェイスに対して暗黙の実装を使用することは不可能です。そうでなければ、両方のインターフェイスで同じ実装が使用されます。 – oxilumin

+0

明示的なインターフェイス宣言を公開することはできません。 – mrydengren

4

問題点は、これらの関数はMyClassのメンバー関数ではないことです。これらの関数はI2.GetRandomStringがI2.GetRandomStringとして定義されているためです。あなただけのインターフェイスのいずれかにそれらを呼び出すことができます。

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

または

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

あなたが呼び出したいメソッドのバージョンを定義し、インターフェイスにあなたのオブジェクトをキャストする必要があります。

クラス内で定義するメソッドのバージョンを1つだけにしたい場合は、インターフェイスの明示的な定義を削除します(つまり、関数の最初の定義からI1を削除します)。完全に)

3

オブジェクトを必要なインターフェイスの種類にキャストし、メソッドを呼び出すことができます。

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

あなたは明示的にインターフェイスを実装しました。したがって、メソッドの実装は、定義したタイプではなく、インターフェースに属します。コンパイラに関する限り、その型のメソッドは存在しません。

呼び出すインターフェイスにインスタンスを明示的にキャストして、メソッドを呼び出す必要があります(他の方法と同様)。

また、インターフェイスの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"; 
    } 

} 

、ちょうど方法の単一の実装を使用(および、明示的な実装を省略)。

関連する問題