带有额外参数的Java接口函数

时间:2016-05-26 16:29:23

标签: java design-patterns interface

我是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

如何组织我的代码来模拟此功能? 我应该怎样做更复杂的功能?我应该在实现我的界面的类中创建一个额外的函数吗?

3 个答案:

答案 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