Hee*_*jin 1 java inheritance implementation casting interface
我有界面Foo
public interface Foo {
public void test();
}
Run Code Online (Sandbox Code Playgroud)
类FooChild实现了接口Foo.
public class FooChild implements Foo {
@Override
public void test() {...}
public void test2() {...}
}
Run Code Online (Sandbox Code Playgroud)
我必须在代码中的某个地方调用函数test2.
Foo f = new FooChild();
((FooChild) f).test2();
Run Code Online (Sandbox Code Playgroud)
我真的很讨厌将类接口转换为类.
所以我添加了另一个界面栏.
public interface Bar extends Foo {
public void test2();
}
public class FooChild implements Bar {
@Override
public void test() {...}
@Override
public void test2() {...}
}
Run Code Online (Sandbox Code Playgroud)
现在我将test2()调用为接口而不是类.
Foo f = new FooChild();
((Bar) f).test2();
Run Code Online (Sandbox Code Playgroud)
我可以将函数test2添加到接口Foo,但实现Foo的类太多了.
如果我添加该函数,我必须向所有实现Foo的类添加代码.
虽然我可以这样做,但实际上我没有编辑Foo的权限.
有没有更好的方法来解决这个问题?(希望没有铸造)
编辑:f作为方法参数传递.
正如乔恩所说,我应该更加具体.对困惑感到抱歉.
public void doSomething(Foo f) {
...
}
Run Code Online (Sandbox Code Playgroud)
如果您知道变量值确实必须是类型FooChild,那么只需声明它:
FooChild f = new FooChild();
f.test2();
Run Code Online (Sandbox Code Playgroud)
如果有什么理由不适合你,那就是你没有告诉我们的事情......
编辑:好的,显然这是一个方法参数:
public void doSomething(Foo f) {
((FooChild) f).test2();
}
Run Code Online (Sandbox Code Playgroud)
......所以不,你无能为力,以避免演员表演.演员表示超出声明的变量类型已经保证的值的要求 - 在这种情况下,你想说"它必须实际上是一个FooChild,而不仅仅是任何实现Foo." 如果您无法更改参数,则转换是表达的方式.
| 归档时间: |
|
| 查看次数: |
3128 次 |
| 最近记录: |