[英]Java: Implementation of Interface with Methods passing Interface parameter
我有一个名为 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, 鲍勃
只要坚持使用IXyz
接口,当您需要切换到其他IXyz
实现时,例如从XyzImpl
到XyzImpl1
,您可以确定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();
}
}
如果您总是需要从IAbc
实现访问abc()
方法,那么您还需要在IAbc
接口中包含abc()
方法
public interface IAbc {
public void setXyz(IXyz val);
public IXyz getXyz();
public void abc();
}
那么你只需要在任何方法调用中使用接口而不是实现。
public void method() {
IAbc abc1 = new AbcImpl();
abc1.setXyz(XyzImpl);
IXyz xyz = abc1.getXyz();
//same as calling abc1.getXyz().doSomething();
abc1.abc();
}
这两种方式都不好:如果您的类要求参数具有.abc
方法,而XYZ
接口没有它,则您不应宣传您接受XYZ
类型的参数。 这就是首先拥有类型系统的全部目的。 如果你不认同这个概念,你最好用 ruby 或 perl 编写代码。
底线:要么将abc
添加到XYZ
,要么在您的ABCImpl
类中使用XYZImpl
。
您的接口 IXyz 中没有方法,因此您需要考虑为什么需要此接口。此外,如果您只需要一个 XYImpl,为什么 IAbc 会获取和设置 IXyz? 通常建议使用“编程实现接口而不是实现”,但在 IXyz 中没有方法,您无法实现。 请参阅此问题以了解为什么建议使用接口而不是实现: “编程到接口”是什么意思? 和http://www.artima.com/lejava/articles/designprinciples.html
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.