ジェネリッククラスの概要
ジェネリック型については、すでに簡単に紹介しておりますので、一度 こちら を一読ください。
ジェネリック化は何も関数だけにしか適用できないわけではありません。クラスや構造体も例外ではなく、ジェネリック化することができます。これにより、より柔軟なコード作成や、パラメータの型だけが違う類似クラスを宣言する必要がなくなるなど、様々なところで恩恵を受けることができます。
ジェネリッククラスを宣言するためには、以下のように 山かっこ(<>) と シングルクォートから始まる型識別子 を利用して宣言します。
type class-name<'a> (x: 'a) = class end
この「シングルクォートから始まる型識別子」のことを型パラメータとも呼ぶので覚えておきましょう。型パラメータは必ずシングルクォートから始まらなければなりません。
複数の型パラメータ指定する場合はカンマ(,)で区切ることで対応することができます。以下は3つの型パラメータを指定する場合のサンプルです。
type SampleClass<'a, 'b, 'c> (x0:'a, x1:'b, x2:'c) = class end
サンプルでみるジェネリッククラス
以下は簡単なジェネリッククラスのサンプルになります。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ========================================================= | |
// ジェネリッククラスのサンプル | |
// ========================================================= | |
// ジェネリック型を持つクラスのサンプル | |
// クラス名の後ろに, シングルクォート(= ')とそれに続くID, 山括弧(<>)を利用して指定します. | |
type SampleClass<'a> (x0: 'a) = class | |
// ジェネリック型のバッキングフィールド | |
let x = x0 | |
// ジェネリック型のget-onlyプロパティ | |
member this.X = x | |
end | |
// int型でSampleClassをインスタンス化 | |
let sample1 = SampleClass (10) | |
// double型でSampleClassをインスタンス化 | |
let sample2 = SampleClass (21.5) | |
// string型でSampleClassをインスタンス化 | |
let sample3 = SampleClass ("test") | |