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

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

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

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

9238閲覧

C#ではメソッドの返り値の型にインターフェイスを指定できるのでしょうか?

appleeeen

総合スコア27

C#

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

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/10/06 13:35

C#ではメソッドの返り値の型にインターフェイスを指定できるのでしょうか?

Unityでコルーチンを初めて使用する際に疑問に思ったので、質問させていただきます。unity,C#ともに初心者です。

コルーチンの関数を定義する際は、下記のように戻り値の型に IEnumerator を指定します。いままで、戻り値の型にはclassやstructの型しか指定したことがないですし、できないと思っていたのですが、インターフェイスであるIEnumerator を戻り値の型として定義しています。

C#

1IEnumerator Fade() { 2 for (float f = 1f; f >= 0; f -= 0.1f) { 3 Color c = renderer.material.color; 4 c.a = f; 5 renderer.material.color = c; 6 yield return null; 7 } 8}

C#ではメソッドの返り値の型にインターフェイスを指定できるのでしょうか?また、その場合インターフェイスの役割はどうなるのでしょうか?

分かる方がいらしたら教えてくださると幸いです????

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

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

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

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

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

guest

回答3

0

ベストアンサー

本来の回答であるインターフェースの扱いに関しては先の方たちがちゃんと解説しているので別の角度の回答を。

もしかして、コルーチンの不可思議な動きに困惑されているのではないでしょうか?
IEnumerator型を返さなければいけないのになんで普通にnullを返して正常に動作するんだろう、とか。
そもそもyieldって何?とか。

新しい繰り返しのスタイル - yield return文とForEachメソッド
ここにあるようにIEnumeratorとyieldを組み合わせた構文は特殊な書き方で普通の関数とはちょっと別物と思った方がいいです。

そして、上記の話はあくまで普通のC#の話です。Unityのコルーチンはこの機能を利用してさらに特殊な機能を実現しています。

こことかここ
で解説されているようにyield を待機処理として扱っています。
「yield return null;」はただ単に1フレーム待つという意味の命令文であり、返り値にはなんの意味もありません。

投稿2016/10/07 01:20

ishi9

総合スコア1294

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

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

appleeeen

2016/10/09 06:06

ご回答ありがとうございます。 そうですね。コルーチンの不思議な動きに困惑されていました。リンク先の記事をみて理解しようと思います。
guest

0

C#ではメソッドの返り値の型にインターフェイスを指定できるのでしょうか?

C#での「型」にはインターフェースも含まれていいますのでメソッドの型(戻り値の型)にも使えます。どんな「型」があるかは「C# 型」で検索するといろいろでてきますがMSDNのページをみると参照型、値型、ポインター型の3種類に大別されていて参照型の中にクラス、インターフェース、デリゲートが含まれるといったことがかかれています。

インターフェイスの役割

質問者さんがクラスとインターフェースを別物のように捉えられているように思いますが、まずは利用者にとって「どんなメソッドやプロパティーがあるかを知る」ことが一番重要で、「実装がどうなっているか」は重要でないという考え方を身に着けられるとよいと思います。そこから始めて「ではクラスとインターフェースはどこが違うのか」を学ばれるとよいと思います。

蛇足:
ご質問には関係ないのですが、例に挙げられている実装はバグではないでしょうか?yieldでColor型のcを返してあげないと意味のないメソッドに見えます。コルーチンとしてだんだん透明になっていくColor型の値を返す関数のはずですよね・・・またIEnumeratorではなくIEnumerator<Color>と書くべきだと思います。
追記:
失礼しました。IEnumerator<Color>と書けるかどうか自分でちゃんと分かっていませんでした。蛇足に書いてしまったことは無視してください。

投稿2016/10/06 15:24

編集2016/10/06 16:43
KSwordOfHaste

総合スコア18394

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

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

appleeeen

2016/10/09 06:03

ご回答ありがとうございます。
guest

0

結論から申し上げますとできます。
参考書によるよくあるような例で言うと、Animalインターフェースを返す(もしくは渡す)ようにしておけば、その実装であるCatやDogを返す(もしくは渡す)ことが可能になります。
ここでAnimalを返すようにしておけば、その処理を利用する側はAnimalの実装クラスであれば同じように処理してもらえると認識でき、再利用しやすい・モジュールの独立性が高まる、などの利点があります。

投稿2016/10/06 13:58

goute

総合スコア216

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

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

appleeeen

2016/10/09 06:03

ご回答ありがとうございます。できるのですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問