我有两个方法的接口
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);
}
答案 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)
没有语法方法可以做到这一点。你必须重构你的课程。
回答以下问题以获得适当的重构:
答案 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。