一个类/多个构造函数与多个类(继承)

时间:2015-04-14 18:26:45

标签: java inheritance interface multiple-inheritance

我正在尝试实现以下树状结构(即Man,Woman,Child,SpecialMan,SpecialWoman,SpecialChild)。是否有更简洁/替代(更少重复的代码)的方式我可以接近它?

public class Person {
    int hat;
    int one_glove;
}

public class Man extends Person {
    int coat;
    int shorts;
}

public class Woman extends Person {
    int coat;
}

public class Child extends Person {
    int shorts;
}
public class SpecialMan extends Man {
    int second_glove;
}

public class SpecialWoman extends Woman {
    int second_glove;
}

public class SpecialChild extends Child {
    int second_glove;
}

我在想的只是让Person包含所有变量,然后简单地为它设置多个构造函数 - >链接到每个特定的对象类型?

public class Person{
 int hat;
 int one_glove;
 int coat;
 int shorts;
 int second_glove;

 public Person(int coat;int shorts; int hat; int one_glove;){} //Man
 public Person(int coat;int hat; int one_glove;){} //Woman
 public Person(int coat;int shorts; int hat; int one_glove; int second_glove;) {} //SpecialMan

 etc...
}

3 个答案:

答案 0 :(得分:0)

简单地继承人类并使用超级

> public class Person{
 int hat;
 int one_glove;
 int coat;
 int shorts;
 int second_glove;

public person(int a,int b,int c,int d,int e){
hat  = a;
one_glove = b;
coat = c;
shorts = d;
second_glove = e;
}

}

class man extends person(){

man(int a,int b,int c,int d,int e){
super(a,b,c,d,e);
}
}

答案 1 :(得分:0)

现在考虑使用方法的简单示例:

public class Animal{
    String name;

    void sleep() {

    }
}

public class Bird extends Animal {
    void whistle() {

    }
}

如果没有继承,你怎么能在没有让所有动物吹口哨的情况下制作只有鸟哨子。

因此,如果您考虑使用方法,那么您肯定要使用继承

答案 2 :(得分:0)

您当前的方法是有道理的,并遵循最佳实践,只保留与相关类中每个类相关的变量(以及可能的行为)。通过将它们全部放在同一个类中,您最终会遇到一个对象可以访问它不需要的变量的情况。此外,在您提出的解决方案中,您最终可能会得到许多额外的代码来确定'键入'是的人。例如

if (coat != 0 && shorts == 0) {
  // Do Child stuff
}

您可以为每个Person分配一个'类型'当它们被实例化时(可能使用Enum),但是你仍然需要对它们的行为发生分歧进行检查。您当前方法的优点是类特定的行为仅限于它所特定的类,因此您永远不必进行此检查。如果Child采用play()方法,则在运行之前,您永远不需要检查您是否真的是孩子。

因此,虽然您可能会在当前的方法中看到重复的代码,但它可能比您提出的解决方案更清晰。您可以通过谨慎使用Interfaces来进一步提高代码的清晰度。