質問

Javaでは、がんの場合を非abstractクラスにいます。

でももに悪いコードがある場合のクラス階層.おか/しないのは何故なんでしょう?

役に立ちましたか?

解決

私は(効果的なC ++で)スコット・マイヤーズのように、私はずっとさらに行く、ジョンとケントに同意するけど。私はは、すべてのクラスがabstract、またはfinal のいずれかであるべきと考えています。つまり、任意の階層における唯一のリーフクラスは直接インスタンス化のために実際にがちです。他のすべてのクラス(継承に即ち内のノード)は「未完」であり、その結果abstractされるべきである。

通常のクラスはさらに拡張するために、

これは単に意味をなさない。クラスの態様は延びるおよび/または修正する価値がある場合は、クリーンな方法は、1つのクラスを取ると一つabstract基本クラスと一の具体交換実装に分離することであろう。

他のヒント

それは非最終具象クラスを持っていることは理にかなっていたときに、

時間は確かにあります。私はクラスは、デフォルトでは(C#で密封された)最終であることを信じて、そして(彼らはC#であるとして)Javaメソッドは、デフォルトでは、最終的でなければならないこと

- しかし、私はケントに同意します。 ケントが言うように、

、継承は慎重な設計とドキュメンテーションを必要とする - それはあなただけで、単一のメソッドをオーバーライドすることができます考えるのは非常に簡単ですが、その方法は、残りの一部として、基本クラスから呼び出すことのできる状況を知りません実装ます。

<「どのように継承のためのクラスを設計します」 /を参照してください。 A>これについてのより多くの議論のため。

この問題は、C#の.NETなど他のプラットフォームにも同様に適用可能です。タイプは、デフォルトでは、最終的な/シールされ、明示的に継承を許可するように開封する必要があるべきだと考えているものは、(私自身を含む)があります。

の継承を介した拡張は、慎重な設計を必要としないだけで開封タイプを残すような単純な何かです。したがって、私は継承を許可する明示的な決断すべきだと思います。

があなたのコード非finalを維持するために十分な理由。このようGuiceの休止状態、春、など多くのフレームワークは、彼らは、実行時に動的に拡張した非最終クラスに時々によって異なります。

例えば、 のがためにプロキシを使用して休止状態遅延関連フェッチ。 それはAOPに来る場合は特にインターセプタがそれに添付することができるように、あなたは、あなたのクラスの非finalをお勧めします。 質問を参照SO

ここにあなたの最良の参照は、「デザインとドキュメント継承のためか、他にそれを禁止する」と呼ばれるジョシュア・ブロックの優れた著書「有効ジャワ」の項目15です。しかし、クラスの拡張を許可するかどうかの鍵は、「それは抽象的である」ではないですが、「それは心の中で継承して設計されました」。そこ両者の間に相関が時々あるが、それは重要である第二のです。簡単な例を取るためにAWTクラスのほとんどが抽象的でないことも含めて、拡張できるように設計されています。

ブロッホの章の概要は祖先がから継承されるように設計されていなかった場合は両親と継承されたクラスの相互作用は驚くべきことであり、予測できないことができるということです。クラスは、そのためのクラスは、最終的なマーク)a)に拡張するように設計されたクラス、およびそれがBをすべきかを説明するのに十分なドキュメントが2種類入って来なければなりません。クラスは、(a)は、多くの場合、常にではないが、抽象的になります。

の場合

あなたは何のサブクラスがありませんを確認するいくつかのケースでは、他のケースでは、あなたは、サブクラス化(抽象)を確保したいです。しかし、原作者として、あなたが気にしないし、気にしてはならないクラスの大規模なサブセットが常にあります。これは、開/閉であることの一部です。何かが閉じられなければならないことを決定することは、<全角>もが理由のために行われるべきです。

私は反対します。階層が悪かった場合は、オブジェクト指向言語が存在しない理由がないと思います。あなたは、MicrosoftとSunからのUIウィジェットライブラリを見れば、あなたは継承を見つけるために、特定のです。定義により、そのすべて「悪いコードは」か?いいえ、もちろんありません。

継承が悪用される可能性がありますが、そのいずれかの言語の機能ができます。トリックは、適切に物事を行う方法を学ぶことです。

僕は賛成です。クラス階層を意味コンクリートの授業時のコンクリートの授業をお知らできる戻り種類の方法がいなく最終的なものとする。例えば、コンクリートクラスのサブクラスフック:

protected SomeType doSomething() {
return null;
}

このdoSomethingはguarenteedする、nullまたはSomeTypeインスタンス.いる機能を有しますのSomeTypeインスタンスでない利用の場合の利用にSomeTypeインスタンスのクラスのものを知りこの機能をもってサブクラスもあります。では意味がないうと、現在のクラスのabstractクラスできる場合にはへと直結させることができるので、デフォルトの何もしないとnull値とします。場)近くでおすすめの抽象クラス、そのうちこの種の階層:

  • 抽象基底クラス
    • デフォルトクラスのクラスに対して非演題のみを実装するprotectedメソッド以外の何もの)
    • その他のサブクラス.

だ開発が重要になってい抽象基底クラスを使用する事が出来ませんが、デフォルトが必要となりますので、最も一般的。その他の階層が少なくクラスの機能を使用できることなく本質的に無駄なデフォルトのクラスで抽象化であったときのクラスです。

  • デフォルトクラス
    • その他のサブクラス.

今、必ず、階層を使用できるよび虐待を受け、いけばなを明確に文書化された授業になり、サブクラスです。これと同じ問題が抽象クラスとして、こちらをクリックして下さいなんの問題だからと言って追加"抄録"をクラスです。例えば、契約のdoSomething()メソッドの上に必要なSomeTypeて人口のx、y、zの分野に入った時のアクセスsetterか、セッター、ラスのサブクラスがブローにご利用いただいていたお客様のコンクリートのクラスが返されるnullの場合お客様の拠点として、クラスまたはabstractクラスです。

一般の経験則を設計するためのクラス階層なのですが、ここでは簡単な範:

  1. いいさんありがとうございます。挙動の私の提案しているスーパークラスに私のサブクラス?(Y/N) この問題を得る必要があります。必要がない場合の挙動が引数は、サブクラス.

  2. いいさんありがとうございます。状態での私の提案しているスーパークラスに私のサブクラス?(Y/N) これは第二の質問です。合状態のモデルに必要なもの、このcanidateのため、サブクラス.

  3. 場合、サブクラスから作成された提案のスーパークラスでは、真の意味では-Aの関係、またはそれだけでショートカットを受け継ぐに行動するのでしょうか。これが最後の質問です。であればただのショートカットとはできませんの資格提案されたサブクラス"として、"スーパークラス、その相続することは避けてください。のロジックにコピー/ペーストできます。に新しいクラス別のルートまたは委譲を使用できます。

場合のみクラスのニーズの動態とそのサブクラスは-A(n)のインスタンスのスーパークラスと考えるべきなの継承からスーパークラス.その他、その他のオプションが存在しないたほうが良いのに適した目的が要求する場合がございます。少しフロントで清浄機。

私たちが動作を変更できるようにしたくないいくつかの例があります。たとえば、Stringクラス、数学ます。

同じことを行うには良い方法は常にありますので、私は、継承を好きではないが、あなたが巨大なシステムのメンテナンスの変更を行っているときに、時には最小限の変更でコードを修正するための最良の方法は、クラスを少し拡張することです。はい、それは悪いコードではなく働いて一つにし、最初の書き換えヶ月なしにつながる通常です。行くには良い方法があり、彼が扱うことができるように、保守者にできるだけ多くの柔軟性を与えます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top