連載:[完全版]究極のC#プログラミング

Chapter2 ジェネリック

川俣 晶
2009/08/17

2.8 ジェネリックなクラスを自作する

 ジェネリックはコレクションには便利だが、一般のクラスやメソッドなどで使うことはあまりない。任意の型を受け入れるという、途方もなく強力なパワーを持ったクラスを作らなければならない機会はあまり多くはない。それだけのパワーを持ったクラスを設計、実装することは一筋縄ではいかないからだ。

 しかし、技術的に見て、定義にジェネリックを使うことは簡単である。ここで、ジェネリックなクラスを自作する例、リスト2.11を見てみよう。ここでは、任意の型の変数を内部に持つだけのクラスを作成している。

using System;

// ジェネリックなMyClassクラスの定義(「T」は型パラメータの名前)
public class MyClass<T>
{
  public T Value;

  public MyClass(T v)
  {
    Value = v;
  }
}

class Program
{
  static void Main(string[] args)
  {
    MyClass<int> i = new MyClass<int>(0);
    Console.WriteLine(++i.Value); // 出力:1

    MyClass<string> s = new MyClass<string>("abc");
    Console.WriteLine(s.Value.ToUpper()); // 出力:ABC
  }
}
リスト2.11 自作ジェネリッククラス

 手順は2つしかない。

 第1の手順として、定義するクラスの名前の後ろに「<」と「>」で囲んで「型パラメータ」の名前を書き込む。ここに書き込む名前は実際に存在しない型の名前でよい。使用されるときに、この名前は実際に指定された型に置き換えられるからである。ちなみに、ここでは「T」または「Tで始まる名前」(TValueなど)を使うのが一般的である。

 第2の手順として、宣言された型パラメータの名前を、“あたかも実在する型の名前であるかのように”使ってクラスを実装する。

 たとえば、「public T Value;」という変数宣言は、あたかもTという型があるかのように記述しているが、実際に使われる場合にはTがintやstringに置き換えられるわけである。


 INDEX
  [完全版]究極のC#プログラミング
  Chapter2 ジェネリック
    1.2.1 ジェネリックとは何か?
    2.2.2 新しいコレクションの紹介
    3.2.3 新しいコレクションクラス―LinkedListクラス
    4.2.4 新しいコレクションクラス―SortedDictionaryクラス
    5.2.5 ジェネリックコレクションの使い方
    6.2.6 ジェネリックメソッドと型推論
    7.2.7 HashtableクラスとDictionaryクラスの非互換性
  8.2.8 ジェネリックなクラスを自作する
    9.2.9 制約の付いたジェネリックなクラス/C++のtemplate機能との相違/練習問題
 
インデックス・ページヘ  「[完全版]究極のC#プログラミング」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間