ブログ「サイバー少年」

ブログ「サイバー少年」へようこそ!
小学六年生ごろからプログラミングを趣味にしている高校生のブログです。
勉強したことについての記事などを書いています。フリーソフトも制作、公開しています。
(当ブログについて詳しくは「ブログ概要紹介」を参照)

サイバー少年が作ったフリーソフトは「サイバー少年の作品展示場」へ

ジェネリックスの勉強まとめ

C#のジェネリックスで色々と理解不足なところが多かったので勉強しました。

C#ってこんなことも出来るんですね!と思いました。

一番のビックリは型引数の数でオーバーロード出来るところです。

メソッドだけでなく、なななんとクラスもオーバーロード出来ます

クラスのオーバーロードってなんか新しいですね…。

今まで、型引数の数が違っていても、同名のクラスを宣言するときは名前空間を変えなきゃいけないと思っていました。

クラスのオーバーロードなんて思いもよらないですよ。

まぁ、別にクラスをオーバーロードしても、C#的には支障はないですからね。

クラスのオーバーロードは、

new List<int>() … int型のリスト
new List() … object型のリスト

みたいに、型引数を指定しなければデフォルトの型になる、という感じの機能を実現できるようにするための物だと思います。


ジェネリックスはクラスだけではなく、メソッドにも使用できます。

メソッドはもちろん引数でオーバーロード出来ますが、ジェネリックスの型引数でもオーバーロード出来ます

public int Sub() { }
public int Sub<T>() { }

こういう、一見おかしなオーバーロードも全然OKです。

本当にビックリです…。


そして、もう一つジェネリックスを使用できるものがあります。
あのデリゲートさんです。

デリゲートでジェネリックスを使用できる理由は、
いちいち引数が〇〇型のデリゲート、引数が△△型のデリゲート…と、書いていく必要が無いようにするため、

つまり、メソッドやクラスでジェネリックスを使用できる理由と同じでしょう。


ちなみに、デリゲートもジェネリックスの型引数の数でオーバーロード出来ます。

Func<>などがそれです。



話は変わりますが、
ジェネリックデリゲートに、ジェネリックメソッドを入れようとしたら、どうなるでしょうか。

いたって普通でした。


DelegeteA<string> = MethodA<string>;
引数の型、引数の数、戻り値の型が合っている限りはOKですね。

DelegateA<int> = MethodA<string>;
これはダメと言いたいところですが、そうとも限りませんよ。


簡単な話が、

public void MethodA<T>(T arg) { }
というメソッドがあったとして、呼び出し側が
Method<string>("hoge");とか書いた時点で、
T is string、

public void MethodA(string arg) { }
というふうに変化します。

つまり、具体的な型に変化させたあと、デリゲートの仕様とマッチするかどうか比べるだけです。

(もちろんデリゲートのほうもT型がint型などに変化します。)

それだけのことです。


そのため、

DelegateA<int> = MethodA<string>;
というコードも、難しいことは考えずに単にT型がstringやintになって、デリゲートの仕様と比べているだけです。

ジェネリックスと直接関係はありませんので、このコードがOKかどうかは場合によります。



しかし、ジェネリックスの型引数の数でオーバーロード出来る、という事実には、本当にビックリです。

C#にも未知の世界はあるものですよ~。

tag:

コメント

C++でいうテンプレートですね。
これがなければスタックやキューやリストといった
抽象データ型を要素の型に合わせて作らなければならず
面倒な上に汎用性もなくなってしまいますから、
欠かせない機能の一つだと思います。

  • 2013/04/20(土) 23:26:58 |
  • URL |
  • div9851 #-
  • [ 編集 ]

Re: div9851

そうですね。
C++のテンプレートとは仕組みが全く異なるようですが、機能としては同じです。

おっしゃるとおり、一番、ジェネリックスの便利さを実感できるのはデータ構造ですよね。
ただ、Arrayクラスはジェネリックスじゃないみたいですね。複雑だ…。

コメントの投稿

トラックバック

トラックバック URL
http://cyberboy6.blog.fc2.com/tb.php/266-cc025329
この記事にトラックバックする(FC2ブログユーザー)

当ブログをご利用(閲覧等)になる場合は必ず「当ブログの利用規定」をお守りください。