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

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

ただいまの
回答率

88.09%

Class継承の実践的なサンプルが読みたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,690

score 24

概念自体は理解できているつもりなのですが、
実践的に使うタイミングがいまいちわからない状況です。

Class継承を上手く使っているプロジェクトなどあれば教えて頂きたいです。

言語は、JavaScriptが理想ですが、TypeScriptなどAltJSも歓迎です。
また、PHP、Ruby、NodeなどいわゆるWeb系の言語であればある程度読むことができますので、わかりやすいものなどあればご紹介くださいませ。

@mpyw様より、わかりやすいコードを紹介いただいておりますが、
JavaScriptやTypeScriptなどで書かれたコードをもう少し知りたいので継続させて頂いております。
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mpyw

    2016/08/24 02:20

    JavaScriptだと継承を生かしているコードが見つかりにくい気がする[要出典]ので,AltJSとして最も有名なTypeScriptで募ったほうがいいような気もします…

    キャンセル

  • raccy

    2016/08/24 06:52

    ECMAScript5以前は、本来classは存在してませんでし、プロトタイプベースでの正しい副作用が無い継承の仕方は結構面倒でしたからな。ECMAScript2015以降を使っているプロジェクトの例を挙げれば…

    キャンセル

回答 3

+2

  • CakePHP
    3.x系のソースを見たときは綺麗なクラスの使い方をしていたと思いました。
  • Atom
    CoffeeScriptになりますが、ViewとかHTMLElement等を拡張しているところがあります。Electronの実装例としてもどうぞ。
  • Visual Studio Code
    こちらはTypeScriptになります。同じくElectronの実装例としてもどうぞ。
  • Javaの標準ライブラリ
    Javaはリストにありませんでしたが、Java APIはオブジェクト指向の見本のようなクラスの設計になっています。java.utilにある各クラスを眺めるだけでも、参考になるのではないかなと思います。
  • Rubyの標準ライブラリ
    組み込みライブラリはCで書いてありますので、Cがわからないとソースから読むのはつらいかと思いますが、継承が使われているところ、たとえば、File < IOやInteger < Numberなどの部分がどうなっているかをドキュメントで見るだけでもためになると思います。組み込みで無いライブラリはPure Rubyで書かれている物もありますので、そちらを見るのも良いと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/24 11:21

    ありがとうございます!
    標準ライブラリは盲点でした。。。
    VSC、Atomあたり参考にしてみます。

    キャンセル

checkベストアンサー

+1

 PHPの例

 例1: mpyw/co

実践的なプロジェクト…といえるかどうか微妙ですが(笑),自作しているライブラリでたまに継承は使用したりするので,その中でもコードが短くて読みやすい一例を紹介させていただきます.言語はPHPで,「限りなくJavaScriptのasync/awaitに近い非同期HTTPリクエスト処理が書ける」というのをモットーにしているライブラリです.

このライブラリは内部で有名なC言語製のlibcurlおよびそれのPHPバインディングを使っています.PHP7.0.7以降ではうまいことリクエストを集中させすぎないように抑制するオプションが設けられているのですが,7.0.6以前では存在していないため手動制御しています.双方に出来るだけラクに対応できるように,抽象クラスと継承を利用しています.

実際のファイルは以下になります.

自動スケジューラではadd()されたリクエストを全部即座にlibcurlに丸投げしていますが,手動スケジューラでは「一定数だけlibcurlに投げて(addImmediate()),上限を超えたぶんはPHP側で保持しておく(addReserved())」というように振り分けており,さらに何かリクエストが1つ終わるたびに1個ずつPHPで保持しておいたもの取り出してlibcurlに投げる(interruptConsume())ことをやっています.このように,内部的な動作が微妙に違います.

但しクラスが独自に持っているものはprivateに過ぎず,継承を抽象クラスから強制されたものはすべてprotectedかpublicになっており,それを呼び出す側からはどちらも同じAbstractSchedulerとして扱える点がミソです.Pool.phpでは3行だけでこの場合分けが済んでおり,中身がどちらになっているかを全く意識する必要がありません.

もし2つのクラスを両方とも一から作る場合,同じようなメソッドをまるまるコピペする場所が生まれてしまって,変更するときに面倒になったり,コードの美しさが損なわれたりします.これを最小限に抑える手段の1つとして,継承は有効です.ただし最近では継承よりもインタフェースミックスイン(トレイト)といった手法のほうが好まれることが増えてきており,使い場所を見極める必要はあります.

 例2: guzzle/psr7 と slimphp/Slim

PSR-7という仕様で決められたメッセージインタフェースの実装例ですが,こちらでは継承を全く使わずにトレイトを活用しています.

一方こちらはトレイトを使わずに継承でやってます.

このように,同じインタフェースを実装する目的でも,2通りのやり方があります.慣れてくるとどっちを使ったほうがいいか何となくわかるようになります[要出典]

 TypeScriptの例

 例3: angular/angular

AngularJSのバージョン2.x系のソースが参考になると思います.

こちらはPHPの例で紹介したSlimのやり方と非常によく似ていますね.

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/24 03:04

    とてもご丁寧にありがとうございます!
    AngularJSは食わず嫌いしていて全く追っていませんでしたが、
    コードリーディングするにはすごく良さそうですねっ。

    最初に書いていただいたPHPのコードも実際にライブラリとして実装されているものかつ、ちょうど良い長さでとても参考になります!

    キャンセル

0

http://www.geocities.jp/m_hiroi/light/js05.html
などにクラスの継承例が書かれていますが、いかがでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/08/24 03:08

    ありがとうございます。
    実装されているコードを読みたかったので少し求めていたものとは違いましたが、
    継承についてはわかりやすい内容でした。

    キャンセル

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

  • ただいまの回答率 88.09%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る