[C#] generic

classやstructの構成がほぼ同じでfieldやmethodのタイプだけが異なるとき、generic classを作り、タイプをパラメタとしてobjectを作ることができる。
generic struct, generic interfaceも同じように宣言できる。

class Point
{
    int x;
    int y;
    ...
}

class Point
{
     double x;
     double y;
     ...
}

がintとdouble以外の違いが無いとすると、

class Point <T>
{
   T x;
   T y;
   ...
}

というgeneric classを定義し、それぞれを

Point <int> pint = new Point <int >();
Point <double> pint = new Point <double>();

と書く。
generics classのtype parameterは複数になることもある。

public class Distionary <TKey, TValue>

Constraints(制約)
Tに入る型はなんでもよい。想定していない型を入れることのないようにtype
parameter Tについての制約を付けることができる。

class Point <T> where T: SomeBaseClass // SomeBaseClassをbase classに持つ
class Point<T> where T: struct // structに限る
class Point<T> where T: new() //パラメタなしのコンストラクタを持つ
class Point<T> where T: class, new() // classでパラメタなしのコンストラクタを持つ
class Point <T> where T: IConvertible // IConvertibleインタフェースを実装

genericが実現された .NET 2.0以降、System.Collections namespace のほとんどの機能はSystem.Colletion.Genericで置き換えられた。

広告
%d人のブロガーが「いいね」をつけました。