SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

C#プログラマのためのF#入門

F#の継承とインターフェイス

C#プログラマのためのF#入門(4)


  • X ポスト
  • このエントリーをはてなブックマークに追加

抽象クラス

 C#同様に、F#にも親クラスで宣言のみされ実装は派生クラスで行われる抽象メンバーが存在します。抽象メンバーは、abstractキーワードを使用して宣言します。抽象メソッドに関しては、上記の継承の例にもありましたが、親クラスにて抽象メソッドを宣言する際に、defaultキーワードを使用してデフォルトの実装を定義することも可能です。

 [<AbstractClass>]属性を持ち、抽象メンバーを持つクラスを抽象クラスといい、このクラスをインスタンス化することはできません。

【構文】抽象クラス
[<AbstractClass>]
type [ アクセス修飾子] 抽象クラス名 =
    [ inherit 親クラス(またはインターフェイス名)]
    [ 抽象メンバー宣言 ]

//抽象メンバー宣言
abstract member メンバー名 : 型シグネチャ

 型シグネチャとは、メソッド用のパラメータの型のことです。例えば、int型の引数を受け取り、unit型のパラメータを返す(つまり戻り値がない)場合はint -> unitというように記述します。

 以下はC#とF#の抽象メソッドとそのデフォルト実装の使用例です。ともにメソッドが親クラスで宣言され、子クラスで実装されています。親クラスは抽象クラスとして宣言されているため、インスタンス化できません。

[リスト7]C#の抽象クラス
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のインスタンスでオブジェクトを実装します。

[リスト8]F#のメソッドの置き換え
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のメソッド

次のページ
インターフェイス

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
C#プログラマのためのF#入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 星山 仁美(ホシヤマ ヒトミ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4714 2010/01/25 22:09

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング