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

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

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

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

Q&A

4回答

6409閲覧

enumの継承について

taka0145

総合スコア7

Java

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

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

0グッド

1クリップ

投稿2021/12/03 08:02

前提・実現したいこと

抽象クラスのenumを継承したいです。

発生している問題・エラーメッセージ

ネットで調べたところ、列挙型のenumは継承できないとあり、 やり方が分からず躓いております。

該当のソースコード

java

1public enum Enum { 2 a, 3 b 4} 5public abstract class A { 6 abstract public Enum getEnum(); 7} 8 9public class B extends A { 10 public Enum getEnum(){ 11 return Enum.a; 12 } 13} 14 15public class C extends A { 16 pubic Enum getEnum() { 17 return Enum.b; 18 } 19}

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

maisumakun

2021/12/03 08:09

「該当のソースコード」部分ですが、「こう書いてみたらエラーになったもの」でしょうか、それとも「どうすればいいかわからず途中で止まってしまった状態」でしょうか?
taka0145

2021/12/03 08:16

書き方が分からず、途中で止まってしまっている状態です。
maisumakun

2021/12/03 08:22

> 列挙型のenumは継承できないとあり、やり方が分からず躓いております。 「何のために」列挙型を継承したかったのでしょうか?
taka0145

2021/12/03 08:49

共通項があれば、抽象メソッドに定義して継承すると考えており、 要素は違うもののEnum自体は共通項のため継承として書こうと思いました。
maisumakun

2021/12/03 08:50

> 要素は違うもののEnum自体は共通項のため どういう意味ですか?
taka0145

2021/12/03 08:55

クラスBではEnum.a; クラスCではEnum.b; Enumは同じなので継承元のクラスAに定義した方がいいのではないかと考えました。
maisumakun

2021/12/03 08:57

> Enumは同じなので継承元のクラスAに定義した方がいいのではないかと考えました。 「Enumは同じ」であれば、そのとおり同じEnum型を使えばいいだけで、Enum自体を継承させる必要はなにもないと思うのですが、何か違う点が気になる感じでしょうか?
taka0145

2021/12/03 09:05

public Enum getEnumを抽象メソッドとして定義しなさい。 という指定がありまして、抽象メソッドとして定義したのなら継承しなければ意味がないのではないかと考えています。
maisumakun

2021/12/03 09:08 編集

> 抽象メソッドとして定義したのなら継承しなければ意味がないのではないかと考えています。 それは「同じEnum型を使う」こととは全く無関係です(「該当のソースコード」ですでにAを継承して実装することが実現できています)。
taka0145

2021/12/03 09:16

同じEnumを持つ場合、継承の処理を書かなくても実質継承した形になっているということでしょうか?
maisumakun

2021/12/03 09:20 編集

えっと、継承すべきはAなのであって、Enumではありません(抽象メソッドの引数がStringだったとして、継承した場合に引数を「Stringを継承した型」に変えることは、ほぼないかと思います)。 すでに、class B extends Aなどのように「Aを」継承できています。
taka0145

2021/12/03 14:39

Enumの継承ばかり考えておりました。 理解力がないにもかかわらず、 ご丁寧に返信いただきありがとうございます。
guest

回答4

0

本来の問題は、『public Enum getEnumを抽象メソッドとして定義しなさい』ですよね?
それなら、意味をはき違えています。

単純に 抽象クラスAのためのメソッドとして定義するだけです。

というか、もしクラスA用にEnum EnumA, クラスB用にEnum EnumB... のように定義するのなら、プログラマは常に変数等を毎回実装しないといけないはずです。

たとえば、public int calc( int a, int b ); みたいなのがあれば、その所属しているクラスごとに IntA, IntB, IntClass1, ... のように定義しないといけないはずです。

でも実際には違うでしょ?

それに、オブジェクト指向の基本的なものを理解していればすぐにあり得ないとわかります。
継承したり実装したりするのは(メソッドを追加するとかの)拡張のためではなく親と同一視するためです。継承/実装しているのに、引数とかが違ったらなんのために継承/実装しているのでしょうか。

仮に、それぞれのメソッドでのreturn Enum.A;のような部分のためだとしても、そもそもenum(列挙体)とは何でしょうか?

単なるデータとは言いますが、なんで列挙体にするのでしょうか。単にデータならintなりlongなりがあるはずです。

それが分かっているのならあり得ないことをしていますよ。

ちなみに、質問にあるコードは問題文によりますが、少なくとも実装は出来ていますよ。

投稿2021/12/03 10:06

編集2021/12/03 10:08
BeatStar

総合スコア4962

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

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

taka0145

2021/12/03 14:44

おっしゃる通りでオブジェクト指向の基本的な理解が不足していたと思います。 クラスごとの関係性を意識して今後取り組もうと思います。
guest

0

参考まで。

項目 38 拡張可能な enum をインタフェースで模倣する
https://takuto-n.github.io/post/20191109-effective-java-3rd-6/#38enum

投稿2021/12/03 08:29

shiketa

総合スコア4041

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

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

0

enum は継承出来ないので意味があるのであって、継承出来たら意味がありません。
出来ないのですからやり方などありません。

継承して何かを表すのでしたら、 class A のように普通のクラスにすれば良いでしょう。

投稿2021/12/03 08:28

jimbe

総合スコア13168

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

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

0

ご自分で調べた通り、出来ないです。

ネットで調べたところ、列挙型のenumは継承できないとあり、

enumで出来るのはinterfaceを実装させる事だけです。

投稿2021/12/03 08:10

Luice

総合スコア771

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問