抽象クラス
C#同様に、F#にも親クラスで宣言のみされ実装は派生クラスで行われる抽象メンバーが存在します。抽象メンバーは、abstractキーワードを使用して宣言します。抽象メソッドに関しては、上記の継承の例にもありましたが、親クラスにて抽象メソッドを宣言する際に、defaultキーワードを使用してデフォルトの実装を定義することも可能です。
[<AbstractClass>]属性を持ち、抽象メンバーを持つクラスを抽象クラスといい、このクラスをインスタンス化することはできません。
[<AbstractClass>] type [ アクセス修飾子] 抽象クラス名 = [ inherit 親クラス(またはインターフェイス名)] [ 抽象メンバー宣言 ] //抽象メンバー宣言 abstract member メンバー名 : 型シグネチャ
型シグネチャとは、メソッド用のパラメータの型のことです。例えば、int型の引数を受け取り、unit型のパラメータを返す(つまり戻り値がない)場合はint -> unitというように記述します。
以下はC#とF#の抽象メソッドとそのデフォルト実装の使用例です。ともにメソッドが親クラスで宣言され、子クラスで実装されています。親クラスは抽象クラスとして宣言されているため、インスタンス化できません。
abstract class testBaseClass //抽象メソッドを持つ抽象クラス { public abstract void testMethodPrint(); } class testChildClass : testBaseClass //testBaseClassを継承 { public override void testMethodPrint() { //抽象メソッドtestMethodPrintの実装 Console.WriteLine("子クラスにて実装されたtestMethodPrint"); } } class Test { static void Main() { // 下記のような抽象クラスtestBaseClassのインスタンス化は不可 //testBaseClass testObjChild0 = new testBaseClass(); testBaseClass testObjChild = new testChildClass(); testObjChild.testMethodPrint(); } }
▼
子クラスにて実装されたtestMethodPrint
F#で抽象メソッドを宣言し、デフォルトの実装を定義する構文は次のようになります。
//抽象メソッド+デフォルト実装 abstract member [inline] セルフ識別子.メソッド名 : 型シグネチャ default member [inline] セルフ識別子.メソッド名 パラメータ[ : 戻り値の型 ] = メソッド本体
以下のリスト8では、抽象クラスtestBaseAbsClassは抽象クラスなので、インスタンス化できず、それを継承するtestChildClassのインスタンスでオブジェクトを実装します。
open System [<AbstractClass>] //抽象クラスなのでインスタンス化できない type testBaseAbsClass () = abstract member testMethod : unit -> unit type testChildClass () = inherit testBaseAbsClass () //testBaseAbsClassを継承 override this.testMethod () = Console.WriteLine("testChildClassのメソッド") //[<AbstractClass>]で宣言された抽象クラスはインスタンス化できず、次の行はエラーになる // let testObj = new testBaseAbsClass() let testObj = new testChildClass() testObj.testMethod();;
▼
testChildClassのメソッド