我是Java和OOP的初学者。我有一个界面,例如动物,可以大喊。
public interface Animal{
public void shout();
}
我的班级Dog
实现了界面,可以对任何人大喊大叫。
public class Dog implements Animal{
public void shout(){
System.out.println("Woof woof");
}
}
我想要一只特定的狗,班级SmarterDog
,可以向特定的人喊叫。
所以我的函数是void shout(String somebody)
,所以我们只有一个额外的参数,但仍然是近似相同的代码。它仍然是Animal
,因此它应该实现Animal
。
如何组织我的代码来模拟此功能? 我应该怎样做更复杂的功能?我应该在实现我的界面的类中创建一个额外的函数吗?
答案 0 :(得分:0)
接口中的方法shout()
和shout(String somebody)
类中的方法SmarterDog
具有相同的名称,但它们是不同的方法。在Java中,方法不仅由其名称标识,还由其参数类型标识。
他们的实施可能会有一些重叠但不相关。接口与实现无关。 (Java 8允许您在接口中定义默认方法实现,但这主要是添加到语言中的便利功能。)
您可以做的是将公共代码放入其他类的辅助方法中,并从shout
方法调用它。您还可以定义一个负责喊叫的类,并将其实例添加到您的动物对象中。这基本上是策略模式的实现 - 听起来很复杂,但如果您的类层次结构变得更复杂,那么它可能是值得的。主要优点是"喊叫" Animal
的方面与其他方面分开。
我可能还会使用shoutTo(String somebody)
参数更改方法的名称,以使其更清晰。
答案 1 :(得分:0)
Java 8引入了default methods,它允许您在界面中指定默认实现,实现类不需要定义他们是否不想要。
你的例子对此并不起作用,因为它不清楚shout(String)
和shout()
之间的关系(即它看起来并不像人们所说的那样)其他),但稍有不同的API可行:
public interface Animal {
/** Shout, including a message. */
void shout(String message);
/** Shout without a custom message. */
default void shout() {
shout("");
}
}
由于在接口中定义了shout()
,所有实现都是免费获得的,并且它们只需要实现shout(String)
,这可能看起来像这样:
public void shout(String message) {
String call = "Woof woof";
if (!message.isEmpty()) {
call += ", " + message;
}
System.out.println(call);
}
默认方法有一些限制(它们必须是公共的,它们无法访问对象的字段等),但对于避免子类中的冗余方法实现非常有用。
答案 2 :(得分:0)
我想要一只特定的狗,类SmarterDog,可以向特定的人发声。
创建一个扩展Dog的新类。
如何组织我的代码来模拟此功能?
将您需要的方法添加到新创建的类中。
它仍然是动物,所以它应该实现动物。
SpecificDog仍然是动物。
public class SpecificDog extends Dog {
public void shout(String somebody) {
System.out.println("Woof at " + somebody);
}
}
我应该为更复杂的功能做些什么?我应该在实现我的界面的类中创建一个额外的函数吗?
据我了解,您需要向特定类添加特定行为,这些行将扩展Dog和/或实现Animal。因此,只需使用必要的行为(方法)创建您的类。从一开始就不要过度复杂化你的模型。尽量让你的抽象尽可能简单。如果你发现一个可以向上移动(到类/接口)的合同,那就去做吧。
// somewhere in your code
SpecificDog dog = new SpecificDog();
dog.shout();
dog.shout("stranger");
输出
Woof woof
Woof at stranger