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

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

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

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

Q&A

解決済

4回答

1562閲覧

javaの継承について

ayorih

総合スコア13

Java

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

0グッド

0クリップ

投稿2020/06/23 21:59

私が勉強した本では継承やインターフェースの実装は現実の関係と同じようにしないといけないというようなことが書いてありました。例えばモンスタークラスがアイテムクラスを継承したりしてはいけないなどです。
私は今シューティングゲームを作っているのですが、メインループを実装するためにプレイヤークラスがRunnableを継承するのはオブジェクト指向的にはあまり良くないのでしょうか?
回答よろしくおねがいします。

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

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

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

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

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

quickquip

2020/06/24 00:25

> 継承やインターフェースの実装は現実の関係と同じようにしないといけない 正確に引用できないでしょうか
guest

回答4

0

継承やインターフェースの実装は現実の関係と同じようにしないといけない

あまりこだわらなくて大丈夫です。

投稿2020/06/23 22:06

maisumakun

総合スコア146018

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

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

maisumakun

2020/06/24 01:31

とはいえ、プレイヤーにRunnableが必要になる状況もたぶんおかしいです(player.run()とは、どのような処理を行うのかわかりません)。
guest

0

ベストアンサー

「論より証拠」です。実際のコード例をたくさん読んでクラスの構成法の定石を学んでいきましょう。JavaやC#の標準ライブラリには多くのヒントが隠されています。積極的にJavaの標準ライブラリについて学びましょう。ちなみにJavaの標準ライブラリはJavaクラスライブラリというらしいです。

AOJ(Aizu Online Judge)などのコードにも学ぶことは多いです。標準ライブラリをユーザー側から多用するためです。簡潔な表現をしようとすれば、必ず標準ライブラリを正しく運用することが求められます。AOJはAtCoderなどと異なり、他人の書いたコードを見ることができます。このことによりプログラミング初心者のスキルを底上げすることができるでしょう。

あと、Java言語に慣れてきたらEffective Javaを読んでくださいね。本屋で立ち読みしたり図書館から借りてくるので可です。

投稿2020/06/25 08:37

編集2020/06/25 08:42
anndonut

総合スコア667

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

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

0

継承やインターフェースの実装は現実の関係と同じようにしないといけない

話の前後があるかもしれませんが、恐らくそれは間違いです。
むしろ、現実と同じような関係性をオブジェクト指向に適用すると混乱が生じます。

実際のアプリケーション開発において、現実の関係をオブジェクトで表現することはほとんどないからです。

シューティングゲームを作っているのですが、メインループを実装するためにプレイヤークラスがRunnableを継承するのはオブジェクト指向的にはあまり良くないのでしょうか

いくつか気になるので箇条書きでコメントします。

  1. メインループを実装する目的が「ターン制のゲームにおけるターンの管理」「画面の描画」などであれば、それをプレイヤークラスが持つのは好ましくありません。その目的を行うにふさわしいクラス(例えば、ゲーム全体の流れを管理するクラス)が持つべきです。プレイヤークラスは残機や移動速度などの状態(フィールド)を持ち、移動や攻撃などの振る舞い(メソッド)を持つのが一般的にふさわしいと思います。
  2. Runnableは和訳すると「(処理を)動作することができる、(足で)走ることができる」です。「~することができる」という表現に継承を用いるのは適切ではないでしょう。なぜなら、そのクラスが実処理を持っているからです。ですから、その実処理の内容に合わせてクラスを命名すべきです。(役割が大きくなりがちですが、GameManagerとでも命名したクラスを定義して、そこでメインループを作り、ゲームの流れを管理する方がわかりやすいと思います)
  3. Runnableを残すのであれば、それは実処理を持たせず、インタフェースであるなら適切だと思います。

java

1interface Runnable { 2 void run(); //実処理をもたず、できることだけ明示しておく 3} 4 5class GameManger implements Runnable{ 6 public void run(){ 7 //メインループ等の実処理 8 //NOTE: 果たして、runという名前だけでメインループを行う処理であると周りは分かるのだろうか? 9 } 10} 11 12class Player{ 13 //残機や移動速度などの状態(フィールド)を持ち、移動や攻撃などの振る舞い(メソッド)を持つ 14}

オブジェクト指向的にはあまり良くないのでしょうか?

メソッドやクラスの命名から中のコードを見なくても何をしているのか**「すぐに」「大体」わかることが大切**です。
例えば「このメソッドの実装、どうなっていたっけな…。せや、中を見たろ!」となった時点で命名が正しくされていないことになります。

今回の場合は「プレイヤーがメインループを持って何かをすること」を分かりやすいと思うかどうかに着目すると良いでしょう。

私は ayorih さんのコードを見る限り「PlayerがRunnableを継承しているのなんでや」とか「Runnableなのになぜ実処理を持ってるねん」とかを疑問に感じました。そして、その疑問を解決するためにPlayerの中の実処理を確認すると思います。

ただし、私がそう認識しているだけですから、ayorih さんが作っていてそれで分かりやすいなら、あなたの中で思うオブジェクト指向的になんら問題ないということになります。そして、一人で開発されていて、かつ命名規則がきちんと整理されているのであれば、それで進めても問題ないのではと思います。

問題は色々な人と開発している場合で、あなたとそれ以外の人で「正しい命名」の基準がズレているとオブジェクト指向的にあまり良くないのではないかと思います。

そこは、世の中のコーディングルール(どのように命名を決めているか)や、アプリケーション(github等で公開されているコードの命名がどうか)を見て基準を理解することでズレを修復できると思います。

投稿2020/06/25 08:25

編集2020/06/25 08:44
BluOxy

総合スコア2663

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

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

0

私が勉強した本では継承やインターフェースの実装は現実の関係と同じようにしないといけないというようなことが書いてありました。

恐らく誤読しています。
「現実の関係」という表現の「現実」を文字通り捉えると、

例えばモンスタークラスがアイテムクラスを継承したりしてはいけないなどです。

という例は出てきません。(「現実」にはモンスターなんていない)

オブジェクトの分析・設計上の話なら、そのクラスは概念上のis-a関連が存在するか?
というところが焦点になるはずです。

「アイテム is モンスター」は成立しないでしょうから、その継承関係がおかしい、というのは合ってますが。

私は今シューティングゲームを作っているのですが、メインループを実装するためにプレイヤークラスがRunnableを継承するのはオブジェクト指向的にはあまり良くないのでしょうか?

Runnableがどんなクラスなのかわかりませんが「メインループを処理するクラス」であれば、is-a関係が成り立つとは思えませんので、オブジェクト指向的には誤っています

投稿2020/06/24 01:28

gentaro

総合スコア8947

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

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

xebme

2020/06/25 06:45

「スッキリわかるJava」で育つと、絵本のイメージだけが身についてしまって、[is-a]関係をきちんと表現できない人が一定数いるのではないかと思われます。[is-a]の概念は振舞いであり、振舞いをきちんと保持できない継承は、多態性が働かなくなることが問題なのですが、テキストの解説がぼんやりしていて、本当の理解が進みません。リスコフの置換原則を学習してください。『アジャイルソフトウェア開発の奥義』ロバートCマーチン Runnableは、java.lang.Runnableのことかもしれません。スレッドとして起動するのなら意味があるでしょうが、質問が曖昧ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問