3

我不确定如何在 Java 中表示包含继承的模型。我有三个从超类继承的类,但其中一个没有与超类不同的属性,也没有方法,例如:

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 没有向 Animal 类添加任何特定于作为 Cow 的行为或数据,Cow 仍然是一种动物。

于 2012-11-13T06:33:05.473 回答
0

不应在动物类中实现“牛”的三个原因:

  1. 动物这个词本身就是一个抽象(类应该是抽象的,不可能创造一个新的)。
  2. 当你定义一个类时,你定义了一个类型(cow 是一个具体的类型,即使没有属性或方法)。如有必要,您还可以使用“instance of”来消除歧义
  3. 最后也是最重要的一点,当你使用继承时,你应该始终遵守替换原则(所有引用“Animal”的元素,都应该将“Animal”替换为“cat”、“dog”或“Cow”)
于 2012-11-13T17:45:05.110 回答
0

我认为您应该创建一个代表Cow对象的新类。考虑几个月后你想添加一些新的行为......没有这个Cow类,你需要重写你的代码的某些部分......你很可能已经测试过的部分。

于 2012-11-13T06:36:28.637 回答
0

正如@Chris 所说,创建一个 Cow 类是可以的,再加上想象一下,如果你有一种喂养动物的方法,你的方法看起来像这样:

public void feedAnimal(Animal animal);

现在,如果您不将牛扩展到动物类,则必须创建第二种方法来喂牛:

public void feedCow(Cow cow); 

即使很难,它也是一种动物

于 2012-11-13T06:42:23.503 回答
0

如果您有除 Cat、Dog 和 Cow 之外的其他动物,并且您通过实例化 Animal 类为这些动物使用对象,那么另一个没有带来任何新东西的 Cow 类没有意义(不是新字段,没有新方法,没有被覆盖方法)。

另一方面,您只有 Cat、Dog 和 Cow 类型的 Animals,那么您应该使 Animal 类成为抽象类(或接口以获得更大的灵活性)。

于 2012-11-13T07:00:05.943 回答
0

恕我直言,如果您的Cow课程与Animal您的设计有问题相同。

我的意思是,只有在您真正需要添加功能时,您才Animal需要一个类和几个扩展类,而不是扩展一个类。BasicAnimal

或者另一种选择是将您Animal的类转换为接口(或抽象类)并实现/扩展它。

在抽象类中,您应该只实现常用方法。但是如果你发现 的行为Cow是相同的Animal可能会更好地走这BasicAnimal条路......

于 2012-11-13T09:39:06.653 回答