[解決済み] Java多重継承
質問
Java の多重継承の問題を解決する方法を完全に理解するために、私は古典的な質問を明確にしておく必要があります。
例えば、クラス
Animal
があり、これがサブクラス
Bird
と
Horse
というクラスを作る必要があります。
Pegasus
を継承する
Bird
と
Horse
から
Pegasus
は鳥であり馬である。
これは典型的なダイヤモンドの問題だと思います。私が理解したところでは、これを解決する古典的な方法は
Animal
,
Bird
と
Horse
クラスのインターフェイスを実装し
Pegasus
を使用します。
鳥や馬のオブジェクトを作ることはできるのですが、他に解決する方法はないでしょうか?もし、動物も作成できる方法があれば、それは素晴らしいことですが、必要ではありません。
解決方法を教えてください。
動物のクラス(生物学的な意味でのクラス)には、次のようなインターフェースを作ることができます。
public interface Equidae
を馬に、そして
public interface Avialae
は鳥類です(私は生物学者ではないので、用語は間違っているかもしれません)。
そうすると、やはり作成するのは
public class Bird implements Avialae {
}
そして
public class Horse implements Equidae {}
そしてまた
public class Pegasus implements Avialae, Equidae {}
コメントから追加
重複するコードを減らすために、実装したい動物の共通コードのほとんどを含む抽象クラスを作成することができます。
public abstract class AbstractHorse implements Equidae {}
public class Horse extends AbstractHorse {}
public class Pegasus extends AbstractHorse implements Avialae {}
更新情報
もうひとつ、細かいことを付け加えたいと思います。として ブライアンの発言 これは、OPがすでに知っていたことです。
しかし、私が強調したいのは、インターフェースで多重継承の問題を回避することを提案していることと、具体的な型(例えば鳥)を表すインターフェースではなく、より振る舞いを表すインターフェース(他の人は鴨型と言いますが、それも良いですが、私は単に鳥類の生物学的分類、鳥綱を意味しています)を使うことを推奨していることです。また、次のような大文字の「I」で始まるインターフェース名を使用することはお勧めしません。
IBird
これは、なぜインターフェイスが必要なのかについて何も語らないものです。つまり、インターフェイスを使って継承階層を構築し、有用であれば抽象クラスを使い、必要であれば具象クラスを実装し、適切であれば委譲を使う、というのが質問の違いです。
関連
-
アクセス制限です。タイプ 'Application' は API ではありません。
-
this()の呼び出しはコンストラクタ本体の最初の文でなければならない 例外解決と原因分析
-
javaでクラスを作成すると、enclosing classでないように見える
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
springboot project MIMEタイプ text/htmlで転送された静的ファイルを読み込む。
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
javaで非静的な解を静的な参照にすることができない
-
spring-boot 401 このリソースにアクセスするには完全な認証が必要です エラー解決
-
アイデア Springboot Web プロジェクトを jar にパッケージ化する場合、Error: 無効または破損した jarfile x.jar 解決策
-
javaでよく使われる英単語
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
java -serverコマンドで「Error: no `server' JVM at ... jvm.dll」を解決する方法です。
-
Java(1)仕上げの基本概念+eclipseのインストール構成
-
ブラウザでの大容量ファイルスライスアップロード(Javaサーバサイド実装)