SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

F#によるオブジェクト指向プログラミングの基礎

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

アクセス修飾子

 F#には以下の3つのアクセス修飾子があります。クラスなどのtypeで宣言されるオブジェクト、メソッド、関数、プロパティ、valで宣言されるフィールドなどに使用できます。アクセス修飾子が指定されていない場合には、type内のletバインドはデフォルトprivateですが、それ以外はpublicになります。

アクセス修飾子
修飾子 概要
public どこからでもアクセス可能
internal 同じアセンブリ内からのみアクセス可能
private 同一モジュール内もしくは、同一のtypeキーワードで宣言されている内部の要素からのみアクセス可能

 C#にあるprotectedはF#にありません。しかし、protectedをサポートする言語で宣言されたクラスやその他の型を使えばprotectedの要素にアクセスすることができます。オーバーライドされたprotectedなメソッドもクラスとその派生クラスからのみアクセスできます。

メンバー

 メンバーとはクラスを構成する、memberキーワードで宣言される要素(メソッド、プロパティ、イベント)とプライマリ以外のコンストラクタのことです。

メソッド

 まず、メンバーの中で最も重要な機能、メソッドについて解説したいと思います。

 メソッドは次のようにmemberキーワードを用いて作成します。

(1)メソッドの定義

 =(イコール)の後ろに続くメソッド本体が長い場合は改行し、インデントをつけます。

【構文】メソッドの定義
[属性]
member [アクセス修飾子] [inline] セルフ識別子.メソッド名 パラメータ [: 戻り値の型]=
    メソッド本体

 クラスを定義する際に、「as セルフ識別子」で指定されたクラス内で有効なセルフ識別子とは別に、メソッド名の前にセルフ識別子を指定することで、メソッド内のみ有効なセルフ識別子を指定できます。

 先ほど作成したクラスにシンプルなメソッドを追加してみます。メソッドの定義はいかなる場合にも、letとdo式の後になります。

[リスト9]a、b、cを表示するメソッドの呼び出し
//クラスの作成
type testClass1(a1 : int, b1 : int) as kore=
    let a = a1 + b1
    let mutable b = a1 * b1
    let mutable c = "hello"
    [<DefaultValue>] val mutable c : int
    [<DefaultValue>] val mutable d : string
    do printf "%d, %d" a b;
    member this.testMethod3() =
        printf "Data: %d %d %s" a b c ;;
//インスタンスの作成とメソッドの呼び出し
let testObj1 = new testClass1(10, 20) ;;
testObj1.testMethod3();;

 ▼

type testClass1 =
  class
    new : a1:int * b1:int -> testClass1
    val mutable c: int
    val mutable d: string
    //testMethodはパラメータを受け取らず(つまりパラメータはUnit型)戻り値がunitである
    member testMethod3 : unit -> unit
  end

>
//プライマリコンストラクタによる処理
30, 200
val testObj1 : testClass1
//メソッドによる処理
> Data: 30 200 hello
val it : unit = ()

 どんな型のパラメータが使用可能か制限するために、メンバー制約という制約が使用できます。メンバー制約を有効にするためには、inline修飾子をつける必要がありますが、メンバー制約についての詳細は次回移行の連載で解説します。

 メソッドに適用できる属性としては、OverloadIDなどがありますが、これについても次回以降の連載にて属性を取り扱う際に解説したいと思います。

(2)スタティックメソッド

 インスタンスを作成せずに直接クラスから呼び出すことができるメソッドをスタティックメソッドと言います(対して呼び出しにインスタンス作成が必要なメソッドをインスタンスメソッドと言います)。

【構文】スタティックメソッド
[属性]
static member [アクセス修飾子] [inline] メソッド名 パラメータ [: 戻り値の型]=
    メソッド本体

 以下の例のように、インスタンスではなく、クラス経由でメソッドが呼べます。

[リスト10]スタティックメソッド
type testClass =
    class
        static member testMethod a b = a + b
    end;;
let a = testClass.testMethod 1 2;;

 ▼

type testClass =
  class
    static member testMethod : a:int -> b:int -> int
  end
>//クラスから直接メソッドが呼び出せた
val a : int = 3

次のページ
まとめ

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

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本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

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

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4600 2009/12/16 14:00

イベント

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

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

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

メールバックナンバー