OOP インタフェイスの優位性について閲覧ありが

Writer: admin Type: arte Date: 2019-01-08 00:00
OOP インタフェイスの優位性について閲覧ありがとうございます。オブジェクト指向プログラミングを行っていまして、当たり前のように継承とインタフェイスを使っていたのですが、あるソース(C#)を見て疑問が沸きましたので、ご教授をお願いいたします。・C++などではない限り、現行のOOPLの多くは多重継承を認めていません。・やむを得ず多重継承を行うときにのみインタフェイスを使っていました。・あるソースで、継承を行わずインタフェイスのみを使っていました。私の考えでは、親クラスを作って継承。各クラスで独自に必ず作らなければならない場合は、抽象メソッドを使えばよいと思ったのですが、インタフェイスのみを使うメリットがありましたら教えてください。C++,Java,PHPなどかじっていますので、そちらの例でも大丈夫です。以上、よろしくお願いいたします。この質問は、活躍中のチエリアン・専門家に回答をリクエストしました。###>インタフェイスのみを使うメリット「インターフェイスのみ」を使うメリットは無いんじゃないかな。それはあえて継承を使わないということになる。インターフェイスを使うメリットはメソッドの実装を強制できることだと思うよ。public abstract class Animal {}public class Rabbit : Animal {}ならRabbit is an Animalと性質を引き継いでいるので、継承を利用するべきだしpublic interface IJumpable {}public class Rabbit : IJumpable {}ならRabbit can do jump、「兎は飛ぶものだ」と表現できるので実装を利用するべき抽象的な機能である以上、そのメリットを伝えるのも抽象的な表現になってしまうけれど、インターフェイスのみを使うメリットは「CAN DO関係」を表現できること。「オブジェクト指向 can-do」なんかでぐぐるともう少し詳しく調べられるかと。ナイス1
###blu様ご解答ありがとうございます。can-do関係、なるほどと思いました。これから少し調べてみたいと思います。
###みなさま、ご回答ありがとうございました。多くの意見を伺い、自分の中で考え、なんとなく使い方が見えてきた気がしました。ベストアンサーは悩みましたが、「can-do関係」を教えていただいたblu様にさせていただきました。まだまだ、オブジェクト指向は不慣れなので、また質問する事もあると思いますが、その時はまた、よろしくお願いいたします。###Java前提 の質問なのか、型ベースOOP全般 なのか、あいまいな気がするんですが。まずは、単純な方から。Java前提:interface を使わず abstract class だけで設計したら、実装の自由度はうんと下がります。理由は単純。あなたも書いてるとおり Javaは多重継承を許さない から。複数人でチーム組んで、1つのソフトを分担開発してるとする。おたがいの接合部分をすべて interface にして始めたんだとすれば、具象クラスの実装の自由度は高い。けど、class だとしたら、そうはいかない。extends は 1つしか許されない から、具象クラスの継承ツリーは、ある程度固定されてしまう。次に一般論で:メリットの有無 でとらえようとするの、おかしいと思う。継承 という単一な用語で呼ぶ人多いけど、型ベースのOOP言語全般、継承 には2種類 あって、別物 だと私は思ってます。(1) インタフェース の継承Javaでいうとこの interface と implements です。C++でいえば 純粋仮想関数のみからなる class から継承。UML用語でいえば、継承 というより「実現」(2) 実装の継承基底クラスのメソッドやインスタンス属性を派生クラスでも利用します、というよくある? 継承。これは、使うべき局面・目的がまったく異なるもので、同一軸に並列に並べて 利点・欠点 的に理解しようとする考え方自体に、私は違和感があります。P.S.(実装も含めての)多重継承 を許容する言語、C++だけじゃないですよ。 他にもあります。# Eiffelもそうだけど、Pythonのclassもそうだったんじゃないかな。# Swiftもそうじゃなかったっけ? (ちょっと自信なし)最近、増えてる気がする。ナイス0
###多重継承というか多態性じゃないですか?Aでもあり、Bでもあるオブジェクトが、Aとして振舞って欲しい時、例えばJavaならListやMapに格納する時は、オブジェクトOをAにキャストして使いませんか?メソッドに縛りを与えるというのは、多態性を持たせる上での副作用ではないでしょうか?医者というインターフェースがあって、医者なら然るべく問診を行えるなら、外科医であっても問診を行うメソッドは必要です。問診を行えるものとして集約したいときなどは抽象的な医者というインターフェースで括った方が良く、医者でありながらも小説家であるなら、執筆するメソッドを含んだ抽象的な執筆家で括った方が取り回しが良いかと思います。こういった多態性を表現するためにインターフェースは優位だと考えます。ナイス0
###まだ完全には理解できていませんが、継承のためっていうより、私は「ポリモーフィズムを表現するため」ととらえています。私のBlogですが。[インターフェース]http://blog.livedoor.jp/crackstars/archives/680023.html子で違う挙動をする場合はインターフェース、それ以外は親クラスとして。で、追加したいだけならなるべく継承は使わずにコンポジションで行う。私の場合、継承をするのは、JavaでいうObjectクラスだっけ? あれでのC++でいうtemplate的な使い方をしたい場合や、実行するまで( あるいはユーザ入力されるまで ) どのオブジェクトが生成されるか不明な場合。デザインパターンのFactoryパターンとかみたいに。ナイス0

 

TAG