• 締切済み

C#のインターフェースを使うとき

C#で「この場合は絶対インターフェースしかない!」 という場面とはどのような場面でしょうか? ポリモーフィズムとカプセル化については分かったのですが、 どうも「これ場合はインターフェースだ!」という例が知りたいと思い 質問させていただきました。 皆様はどのような場面で使用していますか? また、インターフェースを実装するとき全然違う処理を実装してしまった時等はありますでしょうか?

みんなの回答

noname#82346
noname#82346
回答No.2

Framework Design Guidelines という書籍(洋書)では、.NET Framework の設計や開発に携わったような人たちが .NET 開発者向けにソフトウェア設計のガイドラインをいろいろと紹介しています。 そこで書かれているガイドラインを要約すると、インターフェースを使うケースとしては ・値型に継承される必要がある型(IComparable 等) ・多重継承的な継承のされ方をする可能性がある型 だけで、それ以外は通常のクラス(もちろん抽象クラスも含めての話ですが)にするべきである、とあります。 .NET Framework では各所でインターフェースが使われていますが、.NET Framework の開発者たち自身も不必要にインターフェースを使ってしまった箇所については正直いって後悔しているようです。 例外的に AppDomain をまたぐことがあるオブジェクトの型は、MarshalByRef などを継承する必要があるため、基底となるインターフェースを用意する方がいいのですが、とりあえずは気にしなくて良いでしょう。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

> C#で「この場合は絶対インターフェースしかない!」 > という場面とはどのような場面でしょうか? ○複数のクラスに同じ機能を持たせたいが、継承では実現できない場合 (継承する際には、スーパークラスとなれるクラスは1個に限られますよね) ○複数の機能をクラスに持たせたい場合 (多重継承はできませんので) また、インターフェースを見ればそのクラスで何ができるのかが分かりやすいというのもあります。 System.ICloneableインターフェースがついていれば、そのクラスで何が行われているのか分からなくても、 クローンの処理は保証してくれているのがわかります。 > また、インターフェースを実装するとき全然違う処理を実装してしまった時等はありますでしょうか? 0slowlykick0さんが何を連想されているのかが分かりませんが、 インターフェースの定義と実装がまったく異なってしまうことありません。 そういうことが起こるとしたら、設計がまずいか、インターフェースの中身を理解していないということでしょう。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 【C#】内部だけで有効なインターフェースを作りたい

    C#2005でコンポーネントを作ろうと思っています。 そこであらゆるコンポーネントに共通な内部インターフェースが存在し、 更にはコンポーネントはいくつかの種類のコンポーネントを継承したいです。 不可能なコードで記すと、このようなことがしたいです。 【拡張TextBox】 public class ExTextBox : AbstractTextBox { } 【抽象TextBox】 public abstract class AbstractTextBox : TextBox, ICommonControl {  public AbstractTextBox() {   _ifMethod();  }  private void _ifMethod() {  ←これ   // 処理  } } 【内部インターフェース】 public interface ICommonControl {  void _ifMethod(); } インターフェースはpublic宣言以外定義が行えず、内部で利用される インターフェースとしては使えません。 別にインターフェースをそのまま実装すれば出来なくはないですが、 外部にインターフェースを実装したメソッドが見えるのはマズいです。 もしくは多重継承的なことが出来れば解決すると思うのですが・・・。 コンポーネントを継承する関係で、直前のクラスはTextBoxやLabelなどと いったクラスを継承するしかない為、それ以外の内部部分を共通化 したい場合に、どうすればいいのか分かりません。 実現させる方法が思いつかない為、何かシンプルな一例をご提示 頂けないでしょうか?

  • C#でインターフェースのプロパティのアクセス修飾子

    お世話になります。 C#でインターフェースに定義した抽象プロパティで、アクセシビリティまで設定したいです。 例として抽象プロパティHelloのgetをpublic、setをinternalに設定したい場合、次の様に書くと怒られます。 string Hello { get; internal set; } ←"アクセシビリティ修飾子をインターフェイスのアクセサーで使用することはできません。" 抽象プロパティにsetを定義せず、サブクラスでinternalを設定して実装する分には怒られませんが、 この場合はサブクラスに対してsetの実装を強制できませんし、 当然API(インターフェース)型変数からsetの実装を呼び出せません。 全てのクラスはAPIからのみ利用させたいと考えていて、 かつプロパティのset、getで設定したいアクセス修飾子が異なる様な場合、 プロパティを使用せず自前でアクセッサを作るしか無いのでしょうか? 何かおいしい逃げ方がありましたらご教示いただけるとありがたいです。 宜しくお願いします。

  • インタフェースにも実装をもてるの?

    Sun の仕様書などを見ても、インタフェースの使用をみても、メソッドを呼び出した時の処理が書かれていますよね。。。 私の記憶では、インタフェースでは実装をもてなかったハズなんですが… 実装する亊ができるのでしょうか? どなたか、知っている方がいればどうかよろしくお願い致します。

    • ベストアンサー
    • Java
  • インタフェースの継承について

    どのホームページか忘れたのですが、「xxのロジックを行うためにインタフェースのxxを継承します。」 のような記載がありました。 インタフェースはメソッド等の実装の強要で、処理は無いのでは? インタフェースを継承することでxxができるようになります、の 例があるホームページがありましたら紹介お願いします。

  • Interface変数について

    C#勉強初めて間もない者です。 Interfaceについて教えて頂きたい事あります。 Interfaceとは規約を定める為のクラスで、メソッドは定義してあるだけで中身はそのInterfaceを継承したクラスで実装する物だと認識しています。 そこで以下のようなコーディングに出会い混乱しました。。。 IList loList = "22,22,".Split(','); ※へたくそな例ですがお許し下さい 上記のコーディングで、中身のないインターフェイスのloList変数が何故抽象メソッドして定義されている「Add」やプロパティ「Count」が使えるようになるのでしょうか? ご質問に答えて下さる方いらっしゃいましたら宜しくお願いします。

  • アブストラクトとインターフェースの簡単な一例文

    JAVAについて質問よろしくお願いします。 abstract抽象クラスとインターフェースについて下記理解なのですが、超かんたんな一例など欲しいのですが何かないでしょうか。たとえば package round1.chapter1; public class Helloworld { public static void main(String[] args) { System.out.println("こんにちは!"); } } というような一文です。 ~私の理解~ アブストラクトとは、違ったクラス内で同一メソッドがある場合は親クラスに置き、違ったメソッドがある場合は抽象クラスとして親クラスに置いて、実装はサブクラスに任せるという形式で使われる言葉 インターフェースとは、機能だけを仕様書として書いておき、定義されたとおりのメソッドを実装しないといけないという呼び出し方の統一を図る際に使われるメソッド置き場 ~~~~~ このふたつについてものすごく簡単な使用例を頂きたいです。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • I2Cインターフェース

    初歩的な質問ですいません・・・。 私はI2Cインターフェースを使用したハードウェア設計をしているのですが、I2Cインターフェースの通信速度の100kbps、400kbps、3.4Mbpsというのはどれだけ速いのでしょうか? 一般的な通信速度、何がどれくらいで、どの境界から速い遅い、などがよく分からないので、どなたか簡単に説明していただけたら幸いと存じます・・・。 もしよろしければ、通信速度や周波数などの速さなどについても説明、もしくは参考URLなど教えていただければ幸いです。 図々しくも初歩的な質問で申し訳ありません。

  • インタフェースの実装はどこで?

    インタフェースに実装をもてるの?という質問で類似の内容への回答がありましたが、具体例としてどのようになるのかお聞きしたいです。 javax.sound.midiを使用したプログラムです。以下のようなソースを実行したとき、device[]にはMidiDeviceインタフェースを実装したクラスのインスタンスが格納される、というように理解しています。このうち、あるデバイスについてgetClass()を実行したところ、 com.sun.media.sound.MidiOutDevice という名称が出力されました。このクラスは一体どこで実装されているのでしょうか? ---------------------------------------------------------- info = MidiSystem.getMidiDeviceInfo(); device = new MidiDevice[info.length]; for(int i=0; i<info.length; i++){ try{ device[i] = MidiSystem.getMidiDevice(info[i]); } catch(MidiUnavailableException e){} }

    • ベストアンサー
    • Java
  • IDisposableインターフェースの使い方について

    VB2005で開発しています。 インターフェースの勉強をしているのですが、 うまく理解できない部分がありましたので、質問させて頂きました。 IDisposableインターフェースを実装したところ、 Disposeメソッドとその中に GC.SuppressFinalize(Me) という記述が自動で記載されました。 この「GC.SuppressFinalize(Me)」についての質問です。 これはDisposeメソッドを実行した場合は、 明示的にCOMオブジェクトなどの解放処理が行われるため、 ガベージコレクションの機能を実行しなくて良い ということが書かれていると思って良いのでしょうか? そもそもCOMオブジェクトなどは、 明示的に解放しなければ解放できないため、 ガベージコレクションの機能を実行しないことを明示する必要はないのではないか? と疑問に思ってしまったため、質問させて頂きました。 もし宜しければ、ご回答頂けませんか? 宜しくお願い致します。

  • C#のdelegateをC++とjavaで?

    C#のデリゲードを javaとC++でできないでしょうか。 ただし、質問内容を勘違いされそうなので、求めている内容と、 求めていない内容を、詳しく 書きますと。 インタフェース委譲を使った例は、求めていません。 あらかじめ、委譲先に静的に仕組みを 作っておかなく手も、C#のデリゲードのように、シグニチァが同じなら 委譲先をはめ込めれるのが欲しいです。 単なる関数ポインタの例は、求めて いません。 C#でdelegate型を引数にとる ところに、あるインスタンスの メソッドを渡すと。 どのインスタンスのどのメソッドかまで、 認識して、コールバックできます。 関数ポインタでは、これができない。 STLの関数オブジェクトとか、古い感じの情報にヒントがあるか。調べてみましたが。よくわかりませんでした。 結局、この関数オブジェクトは、僕が求めているモノとは、違うような気がします。 よくわかりませんが。 欲しいのは、どのインスタンスのどのメソッドかまでを特定して、 記憶できる型をどうやって javaや、C++で実装できるか。 それをインタフェース委譲のように、 委譲先にあらかじめ、仕込んでおくことなしに。 ただ、メソッドのシグニチァが同じであるだけで、どのインスタンスのどのメソッドかまでを特定して記憶できる C#のデリゲードのような型を。 特殊なコンポーネントを利用せず。 標準的な言語構文のみをつかって、 どのようにしたら、 javaや、C++で、実装できるか? です。 詳しい方が、いらっしゃいましたら、 教えてください。

このQ&Aのポイント
  • iOS 16.6にアップデートしたら、Soundcanvasがダウンロードできなくなってしまいました。調べてみると、開発が終了しているため、新しいiOSには対応していないことがわかりました。そのため、Roland music data browserではダウンロードはできるのですが、midi楽曲のみの再生となってしまいます。Soundcanvasを復活させていただけると助かります。
  • Soundcanvas iOS版のダウンロードに関して困っています。最近iOSを16.6にアップデートしたところ、Soundcanvasがダウンロードできない状況になりました。調査の結果、Soundcanvasの開発が終了しているため、新しいiOSには対応していないことがわかりました。しかし、Roland music data browserはダウンロードできるため、midi楽曲のみの再生が可能です。ただ、それでは用途が限定されてしまうため、Soundcanvasの復活をお願いしたいです。
  • Soundcanvas iOS版のダウンロードに困っています。最新のiOSである16.6にアップデートしたところ、Soundcanvasがダウンロードできなくなってしまいました。調べてみると、Soundcanvasの開発が終了しており、新しいiOSには対応していないことが分かりました。しかし、Roland music data browserはダウンロードできるため、midi楽曲のみ再生することはできます。ただ、私はSoundcanvasの音源を使用したいため、復活をお願いしたいです。
回答を見る