这是设计问题还是Eclipse';s发行或Java';什么是漏洞?
让我们在eclipse的工作空间中定义以下类:这是设计问题还是Eclipse';s发行或Java';什么是漏洞?,java,eclipse,class-design,Java,Eclipse,Class Design,让我们在eclipse的工作空间中定义以下类: public abstract class A { public void foo() { System.out.println("Hi.. this is foo()"); } } public interface I { void foo(); } public class B extends A implements I { public void bark() { System.out.p
public abstract class A {
public void foo() {
System.out.println("Hi.. this is foo()");
}
}
public interface I {
void foo();
}
public class B extends A implements I {
public void bark() {
System.out.println("Hi.. this is bark()");
}
}
public class C {
public void woo() {
I i = new B();
i.foo();
}
}
现在的问题是eclipse在搜索时没有显示对A.foo()的任何引用
- 参考->项目或
- 引用-层次结构
我认为这是一个设计问题。你觉得怎么样?听起来非常合理,因为你提供的代码
A
没有实现I
,只有B
实现。尽管在B
声明中,代码读取扩展A实现I
,但这并不意味着A
将追溯实现接口I
——它表示“B扩展A并实现I”。在Eclipse中适用于我:
A a = new A() { };
a.foo(); // <-- A.foo() found this reference by Eclipse in "References -> Project"
aa=newa(){};
a、 foo();//这当然与eclipse如何查找引用有关。它不必与Java本身做任何事情……我不知道Eclipse方面的情况,但我觉得奇怪的是A没有声明为实现I。从技术上讲,这可能是合法的。实际上,正如Matthew所说,这让人感觉很肮脏,这可能是Eclipse的人员从未像这样实现smthn的原因……是的,即使我同意Matthew和TC1的观点。。这感觉很脏。。让抽象类A实现IYes是否更好,这是真的<代码>公共类C{public void woo(){I I=new B();I.foo();//无法从A.foo()找到引用,因为A尚未实现I B=new B();B.foo();//可以从A.foo()找到引用A A=new B();A.foo();//可以从A.foo()找到引用}
我认为我们应该避免这样设计。。也就是说,我们应该避免在一个独立的抽象类上编写具体的方法。让抽象类A实现IIB更好吗,接口I的实现来自类A。换句话说,A.foo必须满足I要求的契约,并且逻辑上,必须合理地说,A实现了I。代码是公共抽象类A
,而不是公共抽象类A实现了I
,因此A不实现I。在现有代码中,A未标记为实现I-确定。我想说,将A标记为实现I更符合逻辑。