インターフェイスの継承
前回のエントリの引きはとりあえず置いといて,全然別のネタだったりする.
とりあえずネタ元のソースから.*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への継承がどういう意味を持つのだろうか.
と,問題だけ掲げた時点で今日のエントリは終了したりする.
まだ,我輩にも思いつきの段階なので,後日検討してからアップします.