3
//inteface i11 
 public interface i11
    {
        void m11();
    }
//interface i22
    public interface i22
    {
         void m11();
    }

//class ab implements interfaces i11 and i22
    public class ab : i11, i22
    {
        public void m11()
        {
            Console.WriteLine("class");
        }
    }

ここで、Main()メソッドで、インターフェイスメソッドが呼び出されるクラスabのオブジェクトを作成するときに、すべてを説明してください。

4

4 に答える 4

9

メソッドの実装は1つしかないため、参照のタイプに関係なく、明らかにそれが呼び出されます。IE:

i11 o = new ab();
o.m11();

i22 o = new ab();
o.m11();

事実上同じです。

ab.m11両方のインターフェースでメソッドのシグネチャを満たします。また、明示的なインターフェイス実装を使用していないため、それは要因ではありません。

于 2011-01-09T07:47:54.083 に答える
4

インターフェイスの実装と具象クラスの拡張を混同しています。これが関係を逆に考えさせていると思います。定義上、インターフェースには具体的な実装はありません。実装クラスが使用しなければならないコントラクトのみを定義します。おそらく、例が明確にするのに役立ちます。

と呼ばれるインターフェースがあるとしますIBank。このインターフェースの定義は次のとおりです。

IBank
{
    void AddMoney(int amount);
    void RemoveMoney(int amount);
    int GetBalance();
}

次に、このインターフェイスの具体的な実装を次のように示します。

EuroBank : IBank
{
    void AddMoney(int amount){ balance+= amount; }
    void RemoveMoney(int amount){ balance-= amount; }
    int GetBalance(){ return balance; }
    private int balance;
}

の新しいインスタンスを作成できませんIBank。次のコードはコンパイルされません。

IBank bank = new IBank;

代わりに、として扱うことができる銀行の新しい具体的なインスタンスを作成する必要がありますIBank。その後、このクラスのメソッドを呼び出すことができます。

IBank bank = new EuroBank;
bank.AddMoney(7);

したがって、を呼び出すときはAddMoney、インターフェイスで定義されたメソッドを使用しますが、実際にはAddMoneyEuroBankクラスでの具体的な実装を呼び出しています。

したがって、この例では、クラスのm11メソッドを呼び出しています。abただし、との両方をab実装します。したがって、とオブジェクトの両方として扱うことができます。次のコード行は両方とも機能します。 i11i22i11i22

i11 first = new ab();
i22 second = new ab();

どちらのオブジェクトでもメソッドを呼び出すことができますが、m11常にオブジェクトで見つかったメソッドの具体的な実装を使用しますab

于 2011-01-09T07:59:53.287 に答える
4

インターフェースは単に「このインターフェースを実装するものはすべて、これらのメソッドを確実に持つことができる」と言っています。
そのコンテキストで考えると、インターフェイスのメソッドを呼び出さないことがわかります。むしろ、必要なメソッド呼び出しを実装するだけです。

于 2011-01-09T08:34:11.917 に答える
0

このメソッドはインターフェースメソッドではありません。
呼び出されるm11メソッドは、クラスのメソッドですab

于 2011-01-09T07:48:18.653 に答える