2020/11/26(Thu) 10:55:39 編集(投稿者)
参考までに、ジェネリックを使うべき時はどんなときか?
というお話です。
.Netにおいて使用される言語だと、似て非なる処理を1つにまとめるために、
ざっと思いつく限りで以下のような手段があります。
1) 条件分岐
2) オーバーライド
3) ジェネリック
データ値の違いで処理分けを行い、それ以外は共通にしたい場合が、
「条件分岐」です。
--------------------------------------------------------------------
if(条件1) { 条件1のとき行う処理(); }
共通処理();
--------------------------------------------------------------------
データ型の違いで処理分けを行い、それ以外は共通にしたい場合が、
「オーバーライド」です
--------------------------------------------------------------------
public class Base
{
public virtual void Func() { 共通処理(); }
}
public class Deriv1 : Base
{
public override void Func()
{
base.Func();
Deriv1クラスのとき行う処理();
}
}
public class Deriv2 : Base
{
public override void Func()
{
base.Func();
Deriv2クラスのとき行う処理();
}
}
--------------------------------------------------------------------
そして、処理分けするのではなく、データ型の違いそのものを意識せず、
基本的に全てを共通処理としたい場合が、「ジェネリック」です。
--------------------------------------------------------------------
public T Max<T>(T a, T b)
where T : IComparable
{
return (a.CompareTo(b) > 0) ? a : b;
}
--------------------------------------------------------------------
上記のようにすれば、Tの型が何であれ、IComparableさえ実装していれば、
大きいほうを返します。
(例) トレースしてみる
Trace.WriteLine(Max(2, 5));
Trace.WriteLine(Max(3.14, 2.72));
Trace.WriteLine(Max("abc", "xyz"));
Trace.WriteLine(Max(new DateTime(2020, 11, 26), new DateTime(2021, 1, 1)));
(例) トレース結果
5
3.14
xyz
2021/01/01 0:00:00
なんとなく伝われば幸いです