【问题标题】:Java: Implementation of Interface with Methods passing Interface parameterJava:使用传递接口参数的方法实现接口
【发布时间】:2016-03-18 00:33:18
【问题描述】:

我有一个名为 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 应该有abc() 方法,或者你不应该使用IXyz 接口。您不应该需要使用任何无法从您将字段存储为的类型访问的方法。

标签: java methods parameters interface casting


【解决方案1】:

只要坚持使用接口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();
}

【讨论】:

    【解决方案2】:

    两种方法都不好:如果你的类要求参数有.abc 方法,而XYZ 接口没有它,你不应该宣传你接受XYZ 类型的参数。 这就是首先拥有类型系统的全部目的。如果你不同意这个概念,你最好用 ruby​​ 或 perl 编写代码。

    底线:将abc 添加到XYZ,或在ABCImpl 类中使用XYZImpl

    【讨论】:

      【解决方案3】:

      你的接口 IXyz 里面没有方法,所以你需要想想为什么你需要这个接口。另外,如果你只需要一个 XYImpl,为什么 IAbc 获取和设置 IXyz? 通常建议“对接口进行编程而不是实现”,但在 IXyz 中没有方法,您无法实现这一目标。 请参阅这个问题,了解为什么建议使用接口而不是实现:What does it mean to "program to an interface"?http://www.artima.com/lejava/articles/designprinciples.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 2020-07-29
        • 1970-01-01
        相关资源
        最近更新 更多