我有一个叫老虎的基础班

class Tiger implements Attack{
@Override
public void pounce(int intensity){
}
@Override
public void threatLevel(int level){
}


}

攻击界面:

Interface Attack{
void pounce(int intensity);
void threatLevel(int level);
 }


另一个子类SiberianTiger

class SiberianTiger extends Tiger{
public void setupSiberianTiger(int intensity,int level){
  pounce(intenisty);
  threatlevel(level);
}


}

public static void main(){
Attack attack =new SiberianTiger();
//setup the Siberian Tiger meow >.<
((SiberianTiger)attack).setupSiberianTiger(4,5);
}


所以我的问题是,按照我的方式初始化SiberianTiger实例是一个好的设计决策。我该如何改进。
(((SiberianTiger)攻击).setupSiberianTiger(4,5);

最佳答案

您应该使用您知道将使用可用字段和方法的类型来声明变量。在这种情况下,声明以下内容没有任何好处:

Attack attack = new SiberianTiger();
((SiberianTiger)attack).setupSiberianTiger(4,5);


最好将变量声明为SiberianTiger

SiberianTiger siberianTiger = new SiberianTiger();
siberianTiger.setupSiberianTiger(4,5);


在这小段代码中看不到使用超类或接口的好处。例如,如果您有Attack的集合,则可以看到它:

List<Attack> attackList = new ArrayList<>();

SiberianTiger siberianTiger = new SiberianTiger();
siberianTiger.setupSiberianTiger(4,5);
attackList.add(siberianTiger);

for (Attack attack : attackList) {
    attack.<doSomething>();
}


当然,还有其他方法可以改善此设计,例如为SiberianTiger创建适当的构造函数,在其中传递变量,应用Factory Pattern或Builder等。

09-30 11:18