繁体   English   中英

Java:使用传递接口参数的方法实现接口

[英]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实现时,例如从XyzImplXyzImpl1 ,您可以确定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM