我有一个名为IAbc的给定接口,它由一个带有接口IXyz参数的方法组成。我不确定是否应该在我的IAbc实现中创建属性IXyz或属性XyzImpl。
public interface IXyz { }
public class XyzImpl implements IXyz {
public void doSomething() { ... }
}
public interface IAbc {
public void setXyz(IXyz val);
public IXyz getXyz();
}
实施1:
public class AbcImpl1 implements IAbc {
private XyzImpl attr;
public void setXyz(IXyz val) {
attr = (XyzImpl) val;
}
public IXyz getXyz() {
return (IXyz) attr;
}
public void abc() {
attr.doSomething();
}
}
实施2:
public class AbcImpl2 implements IAbc {
private IXyz attr;
public void setXyz(IXyz val) {
attr = val;
}
public IXyz getXyz() {
return attr;
}
public void abc() {
((XyzImpl)attr).doSomething();
}
}
基本上我只想在我的实现AbcImpl中使用我的实现XyzImpl。
在任何情况下,如果我访问我的一个实现的方法abc(),访问方法也需要强制转换。
public void method() {
AbcImpl1 abc;
XyzImpl xyz = (XyzImpl) var.getXyz();
xyz.abc();
}
哪种实施方式更有意义?在我将使用我的实现的所有类中进行转换也不是很方便。有没有办法只使用我的实现类而不是接口?
提前感谢您的反馈!
BR,bobbel
答案 0 :(得分:1)
只需坚持使用界面IXyz
,因此当您需要切换到其他IXyz
实施时,例如从XyzImpl
到XyzImpl1
,您可以确定{{1}将按预期工作。
AbcImpl
如果您始终需要public class AbcImpl implements IAbc {
private IXyz attr;
public void setXyz(IXyz val) {
attr = val;
}
public IXyz getXyz() {
return attr;
}
public void abc() {
attr.doSomething();
}
}
实施中的abc()
方法,那么您需要在IAbc
界面中包含abc()
方法
IAbc
然后你只需要在任何方法调用中使用接口而不是实现。
public interface IAbc {
public void setXyz(IXyz val);
public IXyz getXyz();
public void abc();
}
答案 1 :(得分:0)
两种方式都很糟糕:如果您的类要求参数具有.abc
方法,并且XYZ
接口没有它,则不应通告您接受{{1}类型的参数}。
这就是首先拥有类型系统的全部目的。如果你没有订阅这个概念,你最好用ruby或perl编写代码。
底线:将XYZ
添加到abc
,或在XYZ
课程中使用XYZImpl
。
答案 2 :(得分:0)
您的界面IXyz中没有方法,因此您需要考虑为什么需要此接口。如果您只需要XYImpl,为什么IAbc会获取并设置IXyz? 通常"通过实现编程到接口"建议但在IXyz中没有方法,你没有实现这一点。 请参阅此问题,了解为什么建议使用接口而不是实现:What does it mean to "program to an interface"?和http://www.artima.com/lejava/articles/designprinciples.html