3

継承を含む Java でモデルを表現する方法がわかりません。スーパークラスから継承する3つのクラスがありますが、そのうちの1つは、スーパークラスとは異なる属性もメソッドも持っていません。たとえば、次のようになります。

public class Animal{
  public int a;
  public int b;
  public int c;
}

public class Cat extends Animal (){
  public int d;
  public int e;
}

public class Dog extends Animal {
  public int f;
  public int g;
}

public class Cow extends Animal {
//it doesn't have different attributes or methods than Animal
}

(上記の属性とクラスは単なる例です) どのように設計すればよいですか? 独自の属性を持たずにスーパークラスからのみ拡張するクラスを持つことは正しいですか? または、Cow クラスを省略して Animal からインスタンス化する必要がありますか? ありがとうございました!

4

7 に答える 7

3

動物クラスは、すべての動物が共有する共通のメソッドを持つ抽象クラスであることが望ましいです。その後、Cowクラスを作成して抽象クラスを拡張し、それらの共通メソッドを呼び出すことができます(たとえば、食べたり飲んだり、moo()などの牛用のメソッドを指定したりできます

于 2012-11-13T06:41:06.330 に答える
1

属性を追加しなくても、Animal を拡張する Cow クラスを作成してもかまいません。Cow は、Cow に固有の Animal クラスに動作やデータを追加しなくても、動物の一種です。

于 2012-11-13T06:33:05.473 に答える
0

Cat、Dog、Cow 以外の動物がいて、Animal クラスをインスタンス化することでそれらの動物のオブジェクトを使用する場合、新しいもの (新しいフィールド、新しいメソッド、オーバーライドなし) をもたらさない別の Cow クラスの意味はありません。メソッド)。

一方、タイプが Cat、Dog、Cow の Animals しかない場合は、Animal クラスを抽象クラス (または柔軟性を高めるためのインターフェース) にする必要があります。

于 2012-11-13T07:00:05.943 に答える
0

animal クラスに「cow」を実装すべきでない 3 つの理由:

  1. 動物という言葉自体が抽象化されています (クラスは抽象化されるべきであり、新しいものを作ることは不可能です)。
  2. クラスを定義するときは、型を定義します (属性やメソッドがなくても、cow は具象型です)。必要に応じて、「instance of」を使用して曖昧さをなくすこともできます
  3. 最後に最も重要なことですが、継承を使用する場合は、常に置換の原則に従う必要があります (「動物」を参照するすべての要素は、「動物」を「猫」、「犬」、または「牛」に置き換えて機能する必要があります)。
于 2012-11-13T17:45:05.110 に答える
0

CowあなたのクラスがAnimalあなたのデザインに何か問題があるのと同じである場合、IMHO 。

Animalつまり、クラスを拡張する代わりに、BasicAnimal実際に機能を追加する必要がある場合にのみ、クラスといくつかの拡張クラスが必要になる場合があります。

Animalまたは、クラスをインターフェイス(または抽象クラス)に変換して実装/拡張することもできます。

抽象クラスでは、共通のメソッドのみを実装する必要があります。しかし、 の動作がCowと同じであることがわかった場合は、そのままにしておいAnimalたほうがよいでしょうBasicAnimal...

于 2012-11-13T09:39:06.653 に答える
0

Cow同じように、オブジェクトを表す新しいクラスを作成する必要があると思います。今から数か月後に、いくつかの新しい動作を追加したいと考えています...Cowクラスがなければ、コードの特定のセクションを書き直す必要があります...おそらくすでにテストしたセクション。

于 2012-11-13T06:36:28.637 に答える
0

@Chris が言ったように、Cow クラスを作成しても問題ありません。さらに、動物に餌をやるメソッドがあれば、次のようになると想像してください。

public void feedAnimal(Animal animal);

ここで、牛をクラス Animal に拡張しない場合は、牛に餌をやる 2 番目のメソッドを作成する必要があります。

public void feedCow(Cow cow); 

タフでも動物だ

于 2012-11-13T06:42:23.503 に答える