【发布时间】:2010-10-09 02:04:35
【问题描述】:
在 C# 中,如果您有两个具有相同方法的基本接口(例如 F()),您可以使用显式实现来执行不同的 impl。对于 F()。这使您可以区别对待对象,对应于当前的观点:作为 IMyInterface1 或 IMyInterface2。这在 Java 中可行吗?
【问题讨论】:
标签: c# java explicit-implementation
在 C# 中,如果您有两个具有相同方法的基本接口(例如 F()),您可以使用显式实现来执行不同的 impl。对于 F()。这使您可以区别对待对象,对应于当前的观点:作为 IMyInterface1 或 IMyInterface2。这在 Java 中可行吗?
【问题讨论】:
标签: c# java explicit-implementation
不,没有什么能比得上 C# 在 Java 中的显式接口实现。
从好的方面来说,Java 具有协变返回类型,因此如果您想提供比接口指定的类型更强的实现,那没关系。例如,这很好:
interface Foo
{
Object getBar();
}
public class Test implements Foo
{
@Override
public String getBar()
{
return "hi";
}
}
C# 不允许这样做(在 C# 9 之前,now supports covariant return types) - 解决它的一种方法通常是显式实现接口,然后使用更具体的公共方法(通常由接口实现调用)。
【讨论】:
使用Java中匿名接口实现的机制也可以达到类似的效果。
查看示例:
interface Foo {
void f();
}
interface Bar {
void f();
}
public class Test {
private String foo = "foo", bar = "bar";
Foo getFoo() {
return new Foo() {
@Override
public void f() {
System.out.println(foo);
}
};
}
Bar getBar() {
return new Bar() {
@Override
public void f() {
System.out.println(bar);
}
};
}
public static void main(String... args) {
Test test = new Test();
test.getFoo().f();
test.getBar().f();
}
}
【讨论】:
不,它不应该出现在 Java 中。对于那些对优秀设计不屑一顾的人来说,这只是另一块骨头。
永远不应需要或使用接口的显式实现。有更好的方法来解决这个试图解决的问题。
【讨论】:
只有在方法重载时才能这样做。 如果您有两种方法可以做不同的事情,恕我直言,它们应该有不同的名称。
【讨论】: