我正在尝试实现以下树状结构(即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...
}
答案 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来进一步提高代码的清晰度。