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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

4回答

2714閲覧

インターフェースはis-aの関係かcan-doの関係かどちらが正しいのでしょうか?

usagilove

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

オブジェクト指向

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

2グッド

4クリップ

投稿2023/12/11 04:52

前提

インターフェースやポリモーフィズムの勉強中に、「インターフェースはis-aの関係」と言っているサイトや参考書と「インターフェースはcan-doの関係」と言っている学習サイトなどがあり混乱しています。
私としてはis-aの関係でもcan-doの関係でもなりうると考えていますが何が正しいのでしょうか?

下記の自作ソースコードは一応成り立っているので(手塚治虫のロボット的なのが何人もいる状態と仮定)、can-doの関係は成り立つと思います。
また、スッキリわかるjava入門という参考書に、「インターフェースは抽象クラスの一部」とあり、抽象クラスはis-aの関係で継承しているので、インターフェースはis-aの関係でも使えると解釈しています。

該当のソースコード

php

1<?php 2 3class Mangaka{ 4 public function interview(){ 5 echo "取材をした"; 6 } 7 public function go_sleep(){ 8 echo "寝る"; 9 } 10} 11 12class TedukaOsamu extends Mangaka implements Doctor{ 13 14 15 function ope(){ 16 echo "手術をした"; 17 18 } 19} 20 21interface Doctor 22 { 23 //インターフェイスでは、実装することができない。 24 // public function eat(); 25 26 public function ope(); 27 } 28 29 $teduka=New TedukaOsamu(); 30 $teduka->ope(); 31 32 ?>
boya, marie_222👍を押しています

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

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

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

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

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

maisumakun

2023/12/11 05:23

質問の段階で結論が完結してしまっているように見えますが、何を回答すればいいのでしょうか?
usagilove

2023/12/11 06:20 編集

ご質問ありがとうございます。 インターフェースについて、is-aの関係と言っている人とcan-doの関係と言っている人や本がありますが、どちらも正しいという認識でよろしいのでしょうか?
jimbe

2023/12/11 11:00

理論の通りに現実が、現実の通りに理論が、全てが正しく在るわけではありません。 AかBかを学ぶのでは無く、線上のA点とB点の存在から何が成っているのか・何を成せるのかを考えることを学ぶと世界が広がると思います。
guest

回答4

0

ベストアンサー

https://stackoverflow.com/questions/255644/
C# Interface Implementation relationship is just "Can-Do" Relationship?
のハイスコア回答に全面的に賛成。インターフェースを使うとどんなことが可能になるか? の方がずっとずっと大事

In my experience it doesn't really help that much to think of "is-a" and "can-do" relationships. You rapidly get into problems.
(略)
I wouldn't get too hung up about it - just make sure you understand what they can do and what they can't.

私の経験では、"is-a "と "can-do "の関係を考えることはあまり役に立たない。すぐに問題が発生する。
(略)
あまりこだわる必要はないでしょう。ただ、インターフェイスが何ができて、何ができないかを理解しておいてください。


私的には
is-a と来たら次に期待されるのは名詞で、can-do と来たら次に期待されるのは動詞や形容詞
というだけの違いにしか思えない

そうすると「インターフェースはcan-doの関係」と言いたい人は、インターフェースには形容詞形(Comparableとか)の名前を付けた方が収まりがいい、という考えなのだろうと想像するけれど、
インターフェースに名詞形を使っちゃいけない、とか、クラスに形容詞形を使っちゃいけない、なんてことはないわけでどうでもいいと思ってしまう


(追記)

インターフェースは、それが現実に役に立つから使うわけですし、また役に立つように設計をします。
質問のソースのインターフェースDoctorのような、それをどう使うつもりなのか? が見えないコードでは議論にはあがらないでしょう。

参考にしたという説明が、
「インターフェースの設計が筋がいいかどうか? ということを考えた時のその筋のよさを単純化した指標として、can-do関係になるように心がけるといいですよ
という程度の話であればなにもそこに意見を差しはさむことはないです。
「そうしなさい/そうであるべき/そうでなければならない/それが正しい」みたいな話なら、どうでもいいという感想になります。
そこらへん、正確に引用するか、どんなサイトかポイントしてもらえたらよかったと思います。

ともかく「役に立つ/コードがおかしなことになって困ったりしない」ことが筋がよさを考える時の本来の指標のはずです。
「can-do関係になるように」というのは初学者用の単純化した指標/方針くらいに捉えておいていいように思います。

投稿2023/12/11 08:21

編集2023/12/11 15:37
quickquip

総合スコア11202

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

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

usagilove

2023/12/12 05:58

jimbe様もありがとうございました。 ご教示いただいた内容を元に精進すべく学習を進めます。
guest

0

質問への回答にならないかもしれませんが……

interface 的なものを書いたならば,しっかりとコメント(コード内のコメントではなく別ドキュメントでもいいのかもですが)を書いてください.
今回の例で言えば,

interface Doctor

public function ope();

のに関して,

  • この interface はそもそも何用なのか / 何の役割を持つものなのか.
  • この function というのは何をして,何をしないのか.
    困ったことがあった場合(この例では存在しないけども引数が異常だとかの場合)にはどう振る舞うのか.

といった事柄(仕様)をきっちりと示す.
「きっちりと」というのは,【この interface の具体実装のコードを一切見なくても,この interface を用いてる場所のコードが疑問なく読める】という意味.

で,その示された仕様を見た感じとして「これは "is-a" と呼ぶのが合っていそうか,それとも "can-do" とか呼ぶ方が合っていそうかな」と(考えたければ)考えればいいです.

要は,「 interface ならば → "is-a" 」とかいう話があるのではなくて,
「実際にできた interface (の仕様)を見たら → こいつは "is-a" とか呼べそう」っていう話,みたいな.

投稿2023/12/13 02:13

編集2023/12/13 02:14
fana

総合スコア11954

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

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

fana

2023/12/13 02:26

…とか書いてみたけど, こういう話がリアル世界で通じた(実践してもらえた)ためしがないので,私は間違っているのかもしれません.
usagilove

2023/12/13 12:16

参考に致します。ご回答ありがとうございます。
guest

0

サンプルコードはPHPで、質問文はJavaの参考書の記述を引用しているのがまず、質問の前提を崩しています。
同じ日本語が割り当てられる用語でも言語によって定義も仕様も違いますし、そのような文脈を無視した議論をすること自体がナンセンスです。
数学の「関数」、
C言語の「関数」、
Lispの「関数」、
ぜんぶ全然違う概念ですよね?
それと同じで「インターフェース」という用語の文脈を確定しないと議論の土俵にすら上がりません。

PHPで Traversal インターフェースを実装しているオブジェクトだから foreach で回せるみたいな話をするんだったら can-do の話だし、JavaのListインターフェースと実装クラスのArrayListの関係みたいなのを持ち出せば、ArrayListはListの実装の1つなので、「ArrayListのインスタンスはListですよ」という意味で is-a関係の場合もあります。
同じくJavaのListインターフェースでも、arrayListのインスタンスはListインターフェースを実装しているからadd(e)メソッドを使って要素が追加できるはずだという文脈なら can-do の話です。
要はもうちょい言語や文脈を限定しないと断定できない話題ということです。

投稿2023/12/19 00:19

編集2023/12/19 00:23
marie_222

総合スコア10

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

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

usagilove

2023/12/19 12:35

ありがとうございます
guest

0

既に解決済みなのですが、興味深い質問だと思ったのと、ベストアンサーの回答内容とは若干異なる意見を持っているので少し書かせてもらいます。

何かの物事や対象を捉える場合、「静的な構造」と「動的な振る舞い」の両観点が重要になります。その意味で、インターフェイスは、とりわけオブジェクト指向設計というコンテキストにおいては、「静的な構造」で観た場合「is-a」関係の「」と考えられますし、その型を基にしたインスタンスの「動的な振る舞い」として見た場合には「can-do」の「メソッド」が考えられるわけです。

したがって、ベストアンサーで触れられているような「"is-a "と "can-do "の関係を考えることはあまり役に立たない」や「あまりこだわる必要はない」という意見には賛成しかねます。むしろ常にこれら2つ(「静的な構造」と「動的な振る舞い」)をしっかりと意識してインターフェイスを捉えることが大切だと思っています。

投稿2023/12/19 01:33

amadablam

総合スコア406

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

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

usagilove

2023/12/19 12:35

ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問