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

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

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

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

1回答

3291閲覧

Dart : implements(実装)とextends(継承)の違い

moriman

総合スコア615

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2020/09/24 04:02

https://dart.dev/guides/language/language-tour#implicit-interfaces

implementsを使用したコードが出てきたので、implementsについて調べているのですが、
公式ドキュメントを見ても、継承(extends)との違いがよくわかりません。

サンプルコードを見ても、extendsでできることをimplementsでやっているだけにしか見えません。
それなら継承すればいいのではないか?と思ってしまいます。
これまで継承(extends)とmixin(with)については一応理解できたとは思うのですが、
Dartのドキュメント内で「インターフェース」という単語も出てきていますが、インターフェースの定義も
どこにあるのかよくわかりません。
他の言語などでもインターフェース(implements)についてあまり知識がなく、イメージが沸きにくいです。

継承と実装は具体的に何が違うのでしょうか?
その違いにより、どういう場合に継承(extends)を使い、どういう場合に実装(implements)を使うのでしょうか?

違いがはっきりわかるサンプルなどどこかにありますでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

Dartは同じ「クラス」が、継承元にもインタフェースにもなるので、理解しにくいです。
いったん、Dartという言語を離れて、オブジェクト指向による継承とインタフェースの違いを把握してから、Dartに戻った方が良いです。

参考: インターフェースとは?~継承とは役割が違う~

APIやUIという言葉のI(インターフェース)が入っているように、ある凝集された物事と、別の凝集された物事との間の、疎結合なやりとりのふるまいを規程するのがインタフェースです。ハイレベルには「クリーンアーキテクチャー」といった本を読んでみると、参考になるかもしれません。

継承とインタフェースは、全く異なる概念である、とご理解ください。

投稿2020/09/24 12:40

toast-uz

総合スコア3266

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

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

moriman

2020/09/24 13:11

回答を頂きましてありがとうございます。 お示しいただいたリンク先はJavaでの説明のようですが、こういう継承・実装など は他の言語(Java以外)でもだいたい同じ仕組みなのでしょうか? 言語によって違うとすると、どの言語でわかりにくくない継承・実装の仕組みを 掴むのがよいでしょうか? やはりJavaがいいでしょうか? 理解しにくいのですが、それって結局理解できるような解説が存在しないことが原因のような気がします。 結局他の言語でもここら辺の論点は理解しにくいように思いますし、 Dartであっても適切に理解している人に理解できるように説明を受ければ 済むような気がします。 まあそういう解説がなかなか無いわけですが。 公式ドキュメントですら、コード片を2つくらい載せているだけであり、 サンプルコードでも付随する解説でもあの分量、あの質で本質的なことが掴める人はほとんど いないと思うのですが。 結局言語仕様まで見にいくしかない、ということでしょうか。
toast-uz

2020/09/24 13:21

示したリンクは、コード例はJavaですが、コードに依存しない考え方がきちんとかかれているものとして、紹介しました。細かい仕組みは異なりますが、概念は一緒です。言語にこだわって紹介したわけではありませんし、言語仕様まで見に行かなくても、コンピュータサイエンスとしての理解はできると思います。 ただし、人口の多い言語の方が、こういったコンピュータサイエンス領域のドキュメントが豊富に存在しており、その言語を理解しているとより理解が捗る、というのは否定できません。デザインパターンの本とかもJava前提のものが多いです。なお、最近は、Javaの座がPythonにとって変わってきているようです。
moriman

2020/09/25 01:25

理解しやすい記事をお示し頂きましてありがとうございます。 ざっくりまとめると、 ●まず継承は単一継承しかできないということ ●結局、実装もミックスインも、メンバの存在が実装先・ミックスイン先で保証される点は同じだが、  意味的に    実装は多態性の実現のために、メンバを有していることが保証される点が大きな意味。(全てのメンバの実装が必須)    ミックスインはコードの再利用により、変更があった場合などで保守性が向上する点が大きな狙い という感じでしょうか。
toast-uz

2020/09/25 03:50

質問の主題にも、私の示したリンク先にも、ミックスインについては何も触れられていません。よって、回答は差し控えさせていただきます。
moriman

2020/09/25 07:34

あ、はい???? ありがとうございました。
satokei

2020/09/25 12:39

すこしだけ補足を... > まず継承は単一継承しかできないということ 言語によっては多重継承ができますので、概念の理解としては少し不正確かと思いました。
moriman

2020/09/27 03:03

コメントを頂きましてありがとうございます。 一応まとめはDartに関して、でした。 他の言語の説明を理解して、コード(言語)に依存しない考え方を掴む、というのもなかなか レベルが高いですね。
satokei

2020/09/27 07:23

なるほど。失礼いたしました????‍♂️ いろいろな概念があって難しいですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問