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

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

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

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

Q&A

解決済

2回答

1147閲覧

継承についてよくわからない

chankane

総合スコア139

Java

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

0グッド

0クリップ

投稿2017/05/18 01:20

###前提・実現したいこと
こんにちは、毎度お世話になります。
現在Javaでツクールみたいに、マップチップを使ったゲームを作っています。そこで継承についてわからないことがあったので質問させていただきます。

###発生している問題
現在2つのクラスを作っています。マップチップ1マスぶんの情報(座標、画像、当たり判定の有無等々)を管理するMapChipクラスと、それを継承したMapObjectクラス(プレイヤーや敵みたいに動くものを扱う)です。
MapObjectにおいてどうやって移動させればよいかについて悩んでいます。具体的には、子クラス側でmoveメソッドを定義して動かそうと考えています。しかし、親クラスではフィールドxとyはprivateのため、アクセスできません(当然ですが)。だからと言って、それをprivate以外に変えたくありません(座標を子クラス以外のクラスから勝手に変えられたら困る)。
どのようにしたら2つの要求を同時に満たせるでしょう?
以上です。よろしくお願いします。

###思いついた方法

1. 親クラス側でmoveメソッドを用意する(座標が不変な親クラスでmoveメソッドを定義するのは変?) 2. 親クラス側でsetterを用意して座標を変更する(上記と同じ理由で座標を変更するメソッドは変?)。 3. あきらめてアクセス制限をprotectedに変更する 4. そもそも継承するのをやめるべき

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

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

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

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

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

guest

回答2

0

ベストアンサー

継承するのがおかしいんじゃないですかね。
マップチップというからには地形に関係するもののはずですよね?
プレイヤーや敵は動くものなので、それをマップチップを継承することで表すとしたら、
それはプレイヤーを地形と同列に扱うことになります。それは変ですよね?
なので、そもそも継承するべきではないのです。

投稿2017/05/18 01:26

swordone

総合スコア20649

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

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

chankane

2017/05/18 02:04

Player = MapChip が成り立っていないとダメよといった感じですか? 2つのクラスがイコールで結ばれるときに初めて継承が使えるといった解釈でよろしいでしょうか?
swordone

2017/05/23 00:18 編集

PlayerがMapChipとして扱えるか?ということです。 集合の記号を使うなら、Player ⊂ MapChipなら継承が妥当です。 「山」や「草原」は地形として扱えますが、「人」を地形として扱うのはおかしいですよね? 前者のような「地形の一種」であれば地形を継承して表現できますが、 そうでない人を「地形の一種」と表現するのは無理があります。
chankane

2017/05/18 03:04

ありがとうございます とてもわかりやすいてす たしかに地形の一種ではありませんね ご回答ありがとうございました❗
guest

0

継承を使うべきじゃないという意見に賛成します。

マップ上にあるオブジェクトをまとめて管理したいのであれば、インターフェイスを定義するのが適当です。

もちろんMapChipとMapObjectで同じ実装を使うのであれば抽象クラスを使うのが適当でしょう。XY座標はgetterで取得とすればインスタンス変数のアクセス方法は、継承先で自由にできます。

投稿2017/05/18 03:12

iwamoto_takaaki

総合スコア2883

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

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

chankane

2017/05/22 23:27

こんにちは いろいろ悩んだ結果MapImageという新しいクラスをつくることになりました しかし、おかげさまで抽象クラスとインターフェースの復習をするいい機械になりました ありがとうございました! 特にインターフェースはよく使うと思うので、勉強できてよかったなと思いました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問