Java:通过Interface参数实现Interface with Methods

时间:2016-03-18 00:33:19

标签: java methods parameters interface casting

我有一个名为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

3 个答案:

答案 0 :(得分:1)

只需坚持使用界面IXyz,因此当您需要切换到其他IXyz实施时,例如从XyzImplXyzImpl1,您可以确定{{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