在Java中继承,如何设计没有自己属性的类

时间:2012-11-13 06:29:05

标签: java oop uml

我不确定如何在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中实例化它?谢谢!

7 个答案:

答案 0 :(得分:3)

动物类最好是一个抽象类,其中包含所有动物共有的常用方法。 然后你可以创建一个类Cow扩展抽象类,以便你可以调用那些常用的方法(例如吃喝,并指定牛的方法,如moo()

答案 1 :(得分:1)

可以创建一个扩展Animal的Cow类,即使它没有添加任何属性。即使它没有向Animal类添加任何特定于Cow的行为或数据,Cow仍然是一种动物。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

可以创建一个Cow课程,因为@Chris说,再想想如果你有一种喂养动物的方法,你的方法会看起来像这样:

public void feedAnimal(Animal animal);

现在,如果你不将牛扩展到Animal类,你将不得不创建第二种方法来喂养奶牛:

public void feedCow(Cow cow); 

甚至强硬它是一种动物

答案 4 :(得分:0)

如果你有猫,狗和牛以外的其他动物你通过实例化动物类来为这些动物使用物体,那么没有任何新的领域,没有新的方法,没有任何新的领域,没有被覆盖的方法)。

另一方面,你只有Cat,Dog和Cow类型的动物,那么你应该让你的Animal类成为抽象类(或者更灵活的界面)。

答案 5 :(得分:0)

恕我直言,如果您的Cow课程与Animal相同,那么您的设计就会出现问题。

我的意思是,代替扩展Animal类,可能只需要在实际需要添加功能时才需要BasicAnimal类和几个扩展类。

或者另一种方法是将yor Animal类转换为接口(或抽象类)并实现/扩展它。

在抽象类中,您应该只实现常用方法。但如果您发现Cow的行为与Animal的行为相同,那么最好采用BasicAnimal方式......

答案 6 :(得分:0)

你不应该在集体动物中实施“牛”的三个原因:

  1. 动物这个词本身就是一个抽象(这个类应该是抽象的,不可能是一个新的)。
  2. 定义类时,可以定义类型(即使没有属性或方法,牛也是具体类型)。您还可以使用“实例”来消除歧义(
  3. 最后也是最重要的,当你使用继承时,你应该始终遵守替换原则(所有引用“Animal”的元素,应该用“cat”,“dog”或“Cow”代替“Animal” )