6

Joshua Blotch による効果的な Javaごと:

compareToオブジェクト指向の抽象化の利点を諦めない限り、コントラクトを維持しながらインスタンス化可能なクラスを新しい値コンポーネントで拡張する方法はありません。

上記の例と課題を説明していただけますか? Joshua の「値コンポーネント」とは何を意味するのか、また、他にどのような種類のコンポーネントが利用できるのかについても説明していただけますか?

compareToこれにより、必要に応じてクライアントが 2 番目のクラスのインスタンスを最初のクラスのインスタンスとして表示できるようにしながら、2 番目のクラスで好きなメソッドを自由に実装できます。

また、ジョシュアがファースト クラスのインスタンスとしてセカンド クラスを意味することを説明できますか?

4

2 に答える 2

10

上記の例と課題を説明していただけますか?

もちろん。次のような 2 つのクラスを考えてみましょう。getter や setter などはすべて省略しましたが、うまくいけばドリフトが得られます。

class NamedThing {
    String name;
}

class Person extends NamedThing {
    Date dateOfBirth;
}

これが継承の良い例かどうかは無視してください。単純なものです。

NamedThing名前に基づいてアルファベット順に比較を実装するのは自然なことです。

Personまた、最初に名前を比較する比較を実装するのも自然です(したがって、その点で一貫性が保たれます) が、次にある生年月日が別の生年月日よりも古いかどうかもチェックします

これを想像してみてください:

NamedThing person1 = new Person("Jon", date1);
NamedThing person2 = new Person("Jon", date2);
NamedThing thing = new NamedThing("Jon");

int comparison1 = person1.compareTo(thing);
int comparison2 = person2.compareTo(thing);
int comparison3 = person1.compareTo(person2);
int comparison4 = thing.compareTo(person1);

これらすべての結果をどのようにしたいですか? がその日付処理を のインスタンスにのみPerson.compareTo適用するほどスマートである場合、およびは 0 であると予想されるかもしれませんが、ゼロではありません。Personcomparison1comparison2comparison3

名前のみを比較するを使用しているため、おそらく0 にするcomparison4必要があります。NamedThing.compareTo

基本的に、異なるタイプのインスタンスを比較しようとすると問題があります。使用する比較を定義する、比較の外部定義を持つ方がよりクリーンになります。したがって、参照Comparator<Person>のみを受け入れPerson、名前と日付の両方を使用するComparator<NamedThing>と、名前のみで比較する を作成できます。動作には対称性と明瞭性があります。

また、ジョシュアがファーストクラスのインスタンスとしてセカンドクラスを意味することを説明できますか?

あなたはそれを文脈から外しました。それは次のとおりです:「2番目のクラスのインスタンスを最初のクラスのインスタンスとして表示する」-例

// First class = Animal
// Second class = Zebra
Animal person = new Zebra();
于 2012-11-22T09:28:31.817 に答える
0
  1. これは、サブクラスごとにcompareToメソッドをオーバーライドする必要があることを意味します。
  2. スーパークラスへのキャストはアップキャストと呼ばれます。
于 2012-11-22T09:42:22.447 に答える