インターフェイスの継承

前回のエントリの引きはとりあえず置いといて,全然別のネタだったりする.
とりあえずネタ元のソースから.*1

using System;

namespace Sample
{
  //継承元IF
  public interface IFoo
  {
    void Foo();
    void FooVar();
  }
  
  //継承先IF
  public interface IVar : IFoo
  {
    void Var();
    //継承元のIFを改めて定義するときはnewキーワードが必要(らしい)
    new void FooVar();
  }
  
  //IVarを継承しているので,Foo, Var, FooVarの定義が必要
  class MainClass : IVar
  {
    public void Foo()
    {
      Console.WriteLine("Foo");
    }
    
    public void Var()
    {
      Console.WriteLine("Var");
    }
    
    public void FooVar()
    {
      Console.WriteLine("FooVar");
    }
    
    public void FooVarFunction(IFoo foo)
    {
      foo.FooVar();
    }
    
    public static void Main()
    {
      MainClass m = new MainClass();
      m.Foo();
      m.Var();
      m.FooVar();
      m.FooVarFunction(m);
    }
  }
}


C++からOOPに入り始めた者としてJavaのInterfaceに触れたときに,(静的型付言語の)振る舞いの抽象化はこの機能で極まったと感じたものであった.*2ところが,最近C#を触っているうちに,InterfaceからInterfaceへの継承ができないかと考えるようになった.で,思いつきで上記のコードを書いてみたらどうやら思ったとおり動くらしい.ちなみに,.Netのバージョンは2.0で,Javaでこんな表記ができるのかどうかは不明だったりする.

上記コードの説明としては,FooVarというメソッドを宣言しているIFooをIVarが継承している.IVarが改めてFooVarメソッドを宣言するときには,newキーワードを付けて宣言する.このIVarを継承するクラスはFooVarを実装する必要があり,IFooに代入してFooVarメソッドを実行することができる.


さて,上記のコードを実現するだけならば,IVarを階してIFooを継承しなくても,MainClassがIFooとIVarの2者を継承するだけですむ.このように,Interfaceが複数継承できる以上,上記のようなInterfaceからInterfaceへの継承がどういう意味を持つのだろうか.
と,問題だけ掲げた時点で今日のエントリは終了したりする.


まだ,我輩にも思いつきの段階なので,後日検討してからアップします.

*1:今回はちゃんとコンパイルして実行してるので,コピペして動くソースである

*2:勿論C++でも純粋仮想関数のみの抽象クラスを多重継承して同じことはできるが,洗練されていたとは言いがたい.(C++のやり方があくまで継承という枠に縛られるように感じるのに対して,Interfaceは振る舞いの保証という側面から関係を見ることができる.