如何调用创建一个合适的接口

时间:2011-07-01 11:13:57

标签: java

我有两个方法的接口

interface IFoo{
  void FooOne(A,B,C);
  void FooTwo(D,E,F);
}

现在有两个实现类扩展了这个接口。一个如下:

class Foo1 implements IFoo{
 void FooOne(A,B,C);
  void FooTwo(D,E,F);
} 

其他如下:

 class Foo2 implements IFoo{
  void FooOne(A,B,C);
  void FooTwo(D,E,F);
} 

现在Foo2类根本不需要参数E.参数E仅适用于FOO1类。因此,为什么将此参数传递给类Foo2,这是多么的野心勃勃。那么是否有另一种方式,以便我可以做类Foo2类。

 class Foo2 implements IFoo{
  void FooOne(A,B,C);
  void FooTwo(D,F);
} 

5 个答案:

答案 0 :(得分:2)

如果Foo2不关心E,则应该忽略它。你不能在实现该接口的类中更改FooTwo的签名,它不会产生敏感。 IFoo.FooTwo的调用者不得知道实现它的实际类。

答案 1 :(得分:1)

如果你的接口是FooTwo(D,E,F),那么类Foo2必须实现它。

但是,你可以为Foo2公开另一个非接口重载的公共方法,比如这个

public void FooTwo(D,F) {
  this(D, null, F);
}

答案 2 :(得分:0)

没有语法方法可以做到这一点。你必须重构你的课程。

回答以下问题以获得适当的重构:

  • 为什么在某些情况下不需要参数E?
  • Foo2与Foo1有什么共同之处?
  • 为什么他们需要相同的界面?

答案 3 :(得分:0)

如果Foo2根本不需要参数E,则说明您的界面设计不正确。在接口中,您应该只需要那些与实现无关的方法和参数。这是因为您从界面的用户那里抽象出您的实现,他们不应该关心它是实际实现的Foo1还是Foo2。

答案 4 :(得分:-1)

首先,类不能extend java中的接口。所以代码

class Foo1 extends IFoo{  

当IFoo是一个接口不编译时。

假设你的确意味着implements
当您有一个界面时,您可以定义一个契约,一个骨架。实现此接口的所有类都必须遵循此合同。见How interfaces are actually used

接口应该是通用的,接口中指定的所有内容都应该适用于实现它的所有类。所以

  

现在Foo2类不需要参数   E at al

对界面的设计提出质疑。

你仍然可以在Foo2中使用另一个方法,只需要两个参数D anf F。