質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

2回答

1395閲覧

C♯、インターフェイスの機能について

cushionA

総合スコア90

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

1グッド

0クリップ

投稿2020/08/16 11:41

編集2020/08/16 11:47

前提と状況

C♯のインターフェイスについて質問があります。
僕はインターフェイスとは実装を強制する抽象メソッドの塊で、しかしクラスと違っていくつでも継承可能である故により柔軟に機能の提供を行える……というものだと考えていました。
しかしC♯を学び進めているとこの概念に疑念を抱くことが多くなり、今では全く理解できなくなってしまいました。

よって、以下に挙げるいくつかの疑問の解決をみなさまにご助力いただけないかと思い立ちました。
どうかよろしくお願いいたします。

質問

私にとってのインターフェイスの概念は前項で述べたようなものであります。
しかしIEnumerableをはじめとするコレクションに使わているインターフェイスを見る内に悩むようになりました。

まず、何故ただのインターフェイス、いわば空っぽのメソッドの集まり、設計の下敷きのようなものがLINQなどにおいてコレクションのように扱われているのか分かりません。
また、「IEnumerable〈T〉 変数名」や「IEnumerable〈T〉(返り値の型) TestMethod();」のようにして型のように振る舞っているのも不可解です。
ビジュアルスタジオを起動してソースコードを確認したのですが、そこにはGetEnumeratorという抽象メソッドがポツンとあるだけでした。
検索したのですが、他に特に同名のクラスが見つかるということもありませんでした。

コレクションになったり、かと思えば以前の認識のように使われていたり。
私はインターフェイスが理解できません。
現在Effective C♯という本を勉強しているのですが、インターフェイスが出てくると混乱して全く進みません。

その本ではジェネリッククラスの項目で、IEquatable<T>インターフェイスを継承したクラスに制約すると制約したジェネリッククラス内ではIEquatable<T>の.Equals()メソッドが使えると書いてありました。
これもきっとIEquatable<T>を継承したクラスの中でEqualsメソッドをきちんとオーバーライドしているのでしょうか?
オーバーライドしなければならないという原則すらあやふやに感じています。

このように僕は今ひどく混乱しています。
よろしければご鞭撻のほどお願いいたします。
乱文失礼いたしました。

Bongo👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

僕はインターフェイスとは実装を強制する抽象メソッドの塊で、しかしクラスと違っていくつでも継承可能である故により柔軟に機能の提供を行える……というものだと考えていました。

はいそうです。

何故ただのインターフェイス、いわば空っぽのメソッドの集まり、設計の下敷きのようなものがLINQなどにおいてコレクションのように扱われているのか分かりません。

また、「IEnumerable〈T〉 変数名」や「IEnumerable〈T〉(返り値の型) TestMethod();」のようにして型のように振る舞っているのも不可解です。

あるクラスがコレクションであることと何かしらのインターフェイスを実装していることは矛盾しません。
型のように振る舞っているも何もインターフェイスは型です。
一応ですが、「IEnumerable<T>を返すメソッド」というのは、「IEnumerable<T>を実装した何かしらのクラスを返すメソッド」です。

これもきっとIEquatable<T>を継承したクラスの中でEqualsメソッドをきちんとオーバーライドしているのでしょうか?

はいそうです。

投稿2020/08/16 12:22

編集2020/08/16 12:25
ozwk

総合スコア13528

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cushionA

2020/08/16 12:36

回答ありがとうございます!! すごく腑に落ちました。 >「IEnumerable<T>を返すメソッド」というのは、「IEnumerable<T>を実装した何かしらのクラスを返すメソッド」です。 継承先は継承元のクラスに格納できるのでしたね。 本当に申し訳ありません。 >あるクラスがコレクションであることと何かしらのインターフェイスを実装していることは矛盾しません。 これも上記と同じですね。 たとえばList〈T〉もIEnumerable<T>を継承していたのでした、そういえば。 そして故にIEnumerable<T>型に格納できるということでしょうか? なるほど、とてもすっと理解できました。 本当にありがとうございます。
cushionA

2020/08/16 13:33

返信ありがとうございます。 新機能ですか? インターフェイスに加えられるメンバーの種類が増えたのですね。 継承先により詳細な設計を渡せそうですが、扱いは難しそうですね。 僕はUnityをしていて、アセットツールや新機能のソースコードを読み解けるように学習しているので今すぐ使うことはなさそうですが……。 しかしこういった機能もあるのだと覚えておきます。 ありがとうございました。
guest

0

インターフェイスを考える時には、その名前がヒントになります。
IEnumerableIEquatableみたいなやつです。
~able つまり、~できる。という意味の名前です。
Enumerableの語源は、enumerate(数え上げる)です。それが可能、
つまり、Objectの内容や継承等は、別にして、とにかく「数え上げられる」ものに
IEnumerableインターフェイスを付けます。
そうすれば、それがどんな由来のオブジェクトであろうと、IEnumerable経由で操作を行えば
統一的に扱うことができます。

いわば、インターフェイスというのは、オブジェクトに後付けで装着する操作パネルのようなものです。
同じ操作パネルを装着したものは、同じ操作でコントロールすることができます。

中身のCPUもOSも違う、スマホも、PCも、サーバーも、同じGUIを被せることで、同じ操作方法で扱えるのと同じです。GUIのIはインターフェイスです。

プログラミングコードのレベルで、中身や系統の異なるオブジェクトに対して、共通の操作方法を提供するもの、それがインターフェイスの役割です。

投稿2020/08/16 11:57

amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cushionA

2020/08/16 12:40 編集

インターフェイスについてなんのためにあるのか、という視点に絞ったとてもためになる回答ありがとうございます。 ozwk様の回答で僕がとんでもない考え違いをしていたことに気づきました。 そして認識を矯正した上でamiya様の回答を見ると大変ごもっともなことをおっしゃっていると腑に落ちました。 GUIなどの身近な言葉の例を用いた解説をしてくださり助かりました。 お力添えに心からの感謝を申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問