プログラミング言語の機能の1つで、すでに定義済みのクラスや構造体に、新しいメソッドを追加するもの、またそうして追加されたメソッドのことです。
C# の拡張メソッド、Kotlin の拡張関数が代表的ですが、プログラミング言語ごとに対応はまちまちで、この機能を持っていない言語もあります。
既存のクラスや構造体のソースコードに手を加えたり、継承によって新たなクラスを導入したりせずに、新しいメソッドを追加できることが特徴的です。
拡張メソッドは、実際には対象のクラスや構造体にインスタンスメソッドが追加されているわけではなく、対象のクラスや構造体の型を引数にとる静的メソッドとして生成されます。そのような静的メソッドを拡張メソッドを用いずに自力で記述することも可能ではあるので、拡張メソッドは一種のシンタックスシュガーであるといえます。
たとえば、文字列(stringクラス)に、先頭の文字を大文字に変換する機能が欲しいとします。string の実装に手を加えることはできませんが、拡張メソッドで実現できます。次のサンプルプログラムは C# による例です。
public static class StringExtensions
{
public static string Capitalize(this string str)
{
if (string.IsNullOrEmpty(str)) return str;
return char.ToUpper(str[0]) + str.Substring(1);
}
}
staticキーワードを伴うことで静的メソッドとして定義し、仮引数に thisキーワードとともに対象のクラス型を記述することにより、拡張メソッドとなります。拡張メソッドの本体からは、thisキーワードを伴った仮引数を通して対象のクラス型にアクセスすることになります。
使用側は、あたかも stringクラスが元々定義していたメソッドであるかのように呼び出すことができます。
string s = "hello".Capitalize();
拡張メソッドからアクセスできるメンバは、公開されているものに限られるため、カプセル化を破ってしまうようなことはありません。また、そのため実現できることはヘルパーメソッドのようなものを作る場合と変わりありません。
public class Program
{
// ヘルパーメソッドとして実現する場合
static string Capitalize(string str)
{
if (string.IsNullOrEmpty(str)) return str;
return char.ToUpper(str[0]) + str.Substring(1);
}
}
この方法では次のように呼び出すことになるため、string が元々持っている機能のように使うことはできません。
string s = Capitalize("hello");
拡張メソッドであれば、クラスが元々持っているメンバと同等の存在に見えるため、利用者にとって使いやすく分かりやすくなるメリットがあるかもしれません。また、メソッドチェーンを記述しやすくなるメリットもあります(s.Reverse().Capitalize().AppendSuffix(".bin");
のように連続的にメソッドの呼び出しを繋げること)。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |