web-dev-qa-db-ja.com

Java実装の継承なし

Javaの 最近のビデオ では、Joshua Blochはビデオの4分20秒で次のように述べています。

そして継承もあり、それはマーケティングの必需品でした。実装の継承が本当に必要かどうかを議論できます。

だから私は疑問に思いました:Java実装の継承なしではどのように見えるのでしょうか?たとえば、equalshashCodeおよびtoStringはどのように機能しますか? Java代わりにミックスインのようなものが必要でしたか?

7
fredoverflow

適切なパブリックAPIを使用すると、同じ目的の非常に役立つ.net拡張メソッドのようなものを見ることができます。

public static boolean equals(this Object that, Object other) {
  return (this == other);
}

言語の変更が必要になることは明らかですが、現在の構文と非常によく似た構文で多くの再利用が可能です。

4
Ken Brittain

あなたの特定の例では、代わりにオブジェクトを引数として取る関数を単に使用することについてはどうですか?

toString(Object obj)
hash(Object obj)
equals(Object a, Object b)

私は人々が彼らが「考える」ものが素晴らしいか壊滅的であるという点でかなり過激派である傾向があると思います。

客観的になりましょう。多くの場合、継承は役に立ちます。これは「必需品」ではありませんが、場合によっては非常に便利です。ただし、そうです、それは過度に使用/過度に宣伝される傾向があり、時にはそれがすべきではないところに複雑さをもたらします。

主流のプログラミング言語で継承なしで生きることはできますか?あんまり。それらは不可欠で有用な構成です。それらなしで行うと、お尻の痛みになります。

継承よりも優れた他のメカニズムを見つけることができますか?きっと。単一の継承は非常に制限されており、複数の継承は両面ブレードです。しかし、継承自体が完全に最善のルートではない可能性があります。 1つの方法は、Scalaのようにtraits、Haskellのようにclasses(通常のクラスとは関係ありません)、および他の多くのメカニズムです。

しかし、さらに進んで、「オブジェクト」が私たちの現代の世界に行く方法であるかどうかを尋ねる場合があります。おそらく、代数的データ型および非同期エージェントの何かが、プログラミング言語での超並列処理と表現力の課題によりよく適合します。 (ええ、私は知っています、これはアカデミックなマンボジャンボのように聞こえますが、実際にはその背後に非常に具体的なものがあります。)

4
dagnelies

Googleのgoは、OOPでありながら実装の継承を廃止し、多態性をサポートし、質問に関連する構成可能なインターフェースに関連する言語の例です。

実装の継承に関する最大の問題は次のとおりだと思います。Queueクラスを使用して実装できるStackクラスについて考えてみます。これは2つの方法で行うことができます。1つの方法は、キューからスタックを派生させ、Push()メソッドとpop()メソッドを追加することです。もう1つは、スタック内にQueueインスタンスを埋め込み、それを使用してPush()とpop()を実装することです。一般に、後者が好ましいので、クラス「契約」が混同されることはありません。一方、インスタンスを別のインスタンスに埋め込むことは、クラスの連絡先を損なうことなくコードの再利用を実現する良い方法です。

一方、クラスコントラクト(そのインターフェイス)は、構成可能であるか、継承される必要があります。

3
ritesh

ポリモーフィズムは終わり、継承は手段です。とてもわかりやすく、とても便利だと思います。 Javaでは、私は テンプレートメソッドパターン の大ファンです。これにより、通常、superを呼び出す必要がなくなります。 Javaでsuperを呼び出すたびに、何らかの理由で少し汚れていました。

0
jiggy