【发布时间】:2017-05-06 12:59:06
【问题描述】:
假设我有以下interfaces:
public interface GameObject {
void viewDetails();
}
public interface Weapon extends GameObject {
void attack();
}
//A weapon is not the only item reloadable. A container could be refilled.
public interface Reloadable extends GameObject {
void replenish (final int amount);
}
和实施:
public final class ReloadableWeapon implements Reloadable, Weapon {
private String weaponName;
private int numberofbullets;
public ReloadableWeapon(String name, int bullets){
this.weaponName = name;
this.numberofbullets = bullets;
}
@Override
public void replenish(final int amount) {
this.numberofbullets = amount;
}
@Override
public void attack() {
System.out.println(this.weaponName + " fired");
this.numberofbullets--;
System.out.println("Shots Left: " + this.numberofbullets);
}
@Override
public void viewDetails() {
System.out.println(this.weaponName);
}
}
在 Effective Java 中,其中一章建议我应该通过 interface 声明我的类。我了解优点,但如果我有多个interface 怎么办?
在我的主要方法中,我这样声明:
ReloadableWeapon chargeGun = new ReloadableWeapon("ChargeGun",10);
并像这样使用它:
public static void reloadGameWeapon(Reloadable reload){
reload.replenish(10);
}
public static void attackGameWeapon(Weapon toAttackwith){
toAttackwith.attack();
}
如果我通过interface声明它,我显然只会得到特定接口提供的方法。我可以创建另一个名为 ReloadedableWeapon 的interface,但是会在那里放置哪些方法?我是如何声明和使用我的 ReloadableWeapon 不好的做法或代码味道?
【问题讨论】:
-
“在 Effective Java 中,其中一章建议我应该通过接口声明 [原文如此] 我的类。”通过接口声明一个类是没有意义的。你应该引用书中的确切段落。我们不知道您对这本书的理解是否正确。
-
Effective Java 建议你在接口代表或捕获类的目的时使用接口类型。您定义的接口不属于此类别。这些接口是混合的,即。指示类的补充行为的接口(如 Comparable)。
-
这些接口不应相互继承。
-
@LewBloch - 为什么不呢?你会怎么做?
-
有时您需要在一个接口中使用多种行为(方法),但大多数情况下,每个接口最好有一个抽象方法来体现其主要语义。该类提供了 mixin。
public class ChargeGun implements Replenishable, Weapon, GameItem {。 “接口编程”是指你根据当下的需要,为每个不同的接口声明一个变量。大多数情况下,您只需调用方法,chargeGun.replenish();,而不是通过包装 1 行方法调用来伤害模型。不需要变量。