java - 创建接口(interface)的引用并将其分配给实现对象被认为是一个干净的设计决策

标签 java oop inheritance interface

我有一个名为 Tiger 的基类

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

}

攻击接口(interface):

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

西伯利亚虎的另一个子类

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 实例是一个很好的设计决策。我该如何改进它。
((西伯利亚虎)攻击).setup西伯利亚虎(4,5);

最佳答案

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

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

最好将变量声明为 SiberianTiger:

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

在这一小段代码中看不到使用父类(super class)或接口(interface)的好处。例如,如果您有一组攻击,您就可以看到它:

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

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

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

当然,还有其他方法可以改进此设计,例如为 SiberianTiger 创建适当的构造函数,在其中传递变量、应用工厂模式或构建器等。

关于java - 创建接口(interface)的引用并将其分配给实现对象被认为是一个干净的设计决策,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062348/

相关文章:

java - 如何使用 Chrome Webdriver 关闭下载横幅?

python 3 : TypeError: 'int' object is not callable

c++ - 假设派生类的指针与第一个基类的指针相同有多安全?

mysql - SQL继承,通过ID获取

java - Scanner.hasNext(模式模式)未按预期工作

java - 接口(interface)实现可比吗?

java - 正则表达式除了第一个

python - 使用多重继承调用父类 __init__,正确的方法是什么?

php - 使用 php 从数据库输出数据的最佳方法是什么?

javascript - 关于 JavaScript 中的继承的问题