12

最近、C# が許可されていることがわかりました。

インターフェイスは、1 つ以上の基本インターフェイスから継承できます

たとえばIScreen、Caliburn.Micro では、http: //caliburnmicro.codeplex.com/SourceControl/latest#src/Caliburn.Micro/IScreen.cs でこれを行います。

namespace Caliburn.Micro
{
    public interface IScreen : IHaveDisplayName, IActivate, IDeactivate, 
        IGuardClose, INotifyPropertyChangedEx
    {
    }
}

IScreen実装するクラスが他のインターフェイスも実装する必要があることを意味するため、これが役立つ理由がわかります。

しかし、C# がそのコンパイラとランタイムをどのように処理するのか疑問に思います。

この質問の背景/コンテキスト:

私は、インターフェイスがメソッド テーブルを定義し、インターフェイスを実装するクラスが独自のメソッド テーブルと、実装するインターフェイスのメソッド テーブルへのポインターの両方を持っているというバックグラウンドを持っています。

私の心に渦巻く副次的な質問は、私が過去に人々と行ったさまざまな複数クラスの継承に関する議論から生じており、それらはこのケースにも当てはまると思います。

  • インターフェイスが複数の基本インターフェイスから継承できるようにすると、そのテーブル内のメソッドの順序はどうなりますか?
  • これらのインターフェイスが共通の祖先を持つ場合はどうなるでしょうか? これらのメソッドはテーブルに複数回表示されますか?
  • これらのインターフェイスの祖先が異なっていても、メソッド名が似ている場合はどうなるでしょうか?

(ここではメソッドという言葉を使用しています。これは、インターフェイスで定義されたプロパティに get_ または set_ メソッドがあることを意味しています)。

これについての洞察と、この質問をより適切に表現する方法に関するヒントは大歓迎です。

4

2 に答える 2

9

まず第一に、「インターフェース継承」はクラスベースの継承とまったく同じではないことを明確にしましょう (そして、「継承」という言葉を両方に使用することはおそらく誤解を招く可能性があります)。

これは、インターフェイスを単独でインスタンス化できないため、コンパイラとランタイムのペアが、スタンドアロン インターフェイス タイプの仮想呼び出しを行う方法を追跡する必要がないためです (たとえば、呼び出し方法を知る必要はありませんIEnumerable.GetEnumerator特定のタイプのオブジェクトでそれを呼び出す方法を知るために)。これにより、コンパイル時に異なる処理を行うことができます。

コンパイラが「インターフェイス継承」をどのように実装するかは実際にはわかりませんが、次のように実行できます。

インターフェイスが複数の基本インターフェイスから継承できるようにすると、そのテーブル内のメソッドの順序はどうなりますか?

「派生」インターフェースは、実際にはそれらのいずれも実装していないため、すべての祖先インターフェースのメソッドを含むメソッド テーブルを持つ必要はありません。各インターフェイス タイプは、それ自体が定義するメソッドのテーブルのみを持つだけで十分です。

これらのインターフェイスが共通の祖先を持つ場合はどうなるでしょうか? これらのメソッドはテーブルに複数回表示されますか?

前の質問に対する答えを考えると、いいえ。最終的に、具象型は、実装されたインターフェイスの「階層」にIFoo何回IFoo出現しても、一度だけ実装されます。で定義されたメソッドは、の簿記テーブルIFooにのみ表示されます。IFoo

これらのインターフェイスの祖先が異なっていても、メソッド名が似ている場合はどうなるでしょうか?

繰り返しますが、問題ありません。IFoo.Frobコンパイラに「実装方法はこちら、実装方法はこちら」と伝えるには適切な構文が必要ですが、とのIBar.Frobメソッドは別のテーブルにマッピングされるため、技術的な問題はありません。IFooIBar

もちろん、これには「メソッドは実行時にどのようにディスパッチされるのか?」という疑問が残ります。未回答。しかし、考えられる解決策を想像するのはそれほど難しくありません。それぞれの具象型Cには、実装するインターフェイスごとに 1 つのメソッド テーブルへのポインターがあります。仮想メソッド呼び出しを行うとき、ランタイムは具象型を調べ、メソッドが呼び出されるインターフェイスのテーブルを見つけ (インターフェイスの型は静的に認識されます)、呼び出しを行います。

于 2013-11-14T10:15:47.933 に答える