2015-04-14 1 views
4

Я пытаюсь реализовать следующую древовидную структуру на данный момент (т. Е. 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... 
} 
+1

Что такое 'man' в конструкторе? – Nomad

+0

Лучше использовать интерфейсы для указания наличия дополнительных полей – ControlAltDel

+0

Что вы подразумеваете под одним классом или несколькими конструкторами? Я понимаю, что класс имеет более 1 конструктора. Вы можете по крайней мере выяснить, что необходимо, а также предоставить образец, если это возможно. Ура! – Avidos

ответ

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); 
} 
} 
+0

Пожалуйста, отформатируйте код. – Basilevs

0

Рассмотрим простой пример с методами сейчас:

public class Animal{ 
    String name; 

    void sleep() { 

    } 
} 

public class Bird extends Animal { 
    void whistle() { 

    } 
} 

Как теперь сделать только Птичий свист, не делая все животные свистеть без наследования ,

Так что, если вы считаете, чтобы иметь методы, то, конечно, вы хотите использовать наследование

0

Ваш текущий подход имеет смысл и следует наилучшей практики лишь сохраняя переменных (и, предположительно, поведение), это отношение к каждому классу в соответствующем классе. Поместив их все в один класс, вы попадете в ситуацию, когда объект будет иметь доступ к переменной, в которой она не нужна. Кроме того, в вашем предлагаемом решении вы, вероятно, в конечном итоге получите много дополнительного кода, чтобы выяснить, что такое «тип» человека. например.

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

Вы можете присвоить каждому Person «тип», от того, когда они инстанцируются (возможно, с помощью Enum), но вы все равно должны сделать проверку против этого, когда их поведение расходятся. Преимущество вашего нынешнего подхода заключается в том, что поведение конкретного класса ограничивается классом, для которого он специфичен, поэтому вам никогда не придется делать эту проверку. Если Child имеет метод play(), вам не нужно будет проверять, действительно ли вы являетесь ребенком перед его запуском.

Так что, хотя вы можете видеть повторяющийся код в своем текущем подходе, это, вероятно, будет намного яснее, чем предлагаемое вами решение. Вы можете увеличить ясность своего кода, тщательно используя Interfaces.

 Смежные вопросы

  • Нет связанных вопросов^_^