【问题标题】:Java: Implementing an interfacing by inheriting a classJava:通过继承类来实现接口
【发布时间】:2015-08-03 05:14:16
【问题描述】:

适时的问候:)

在 Java 中工作,我有一个接口 A。这个接口的所有实现者也扩展类 B,但 B 没有实现 A。在我们使用 A 的实例(引用为 A)的类中,它被强制转换为一个 B 引用,以便我们可以使用 B 类中定义的方法。从概念上讲,该方法也应该属于接口 A。

你能想出一个不将方法引入接口 A 的理由,这样我们就不必将它强制转换为 B 吗?我是否应该覆盖子类中的方法并只调用超级版本,以便在 IDE 等中更容易导航?

【问题讨论】:

  • 为什么 B 没有实现 A?
  • 我不知道这些类实际上是什么,但听起来可以通过重新设计整个系统来解决。
  • 扔掉接口A,只用B类。
  • 问题是你为什么不把这个方法介绍给A。答案是:在好的OOP设计中,你通常希望有小的接口,根据单一职责原则。如果您的接口定义的方法多于单一职责,请将其拆分为两个接口。

标签: java inheritance interface casting


【解决方案1】:

在我们使用 A 的实例(引用为 A)的类中,它被强制转换为 B 引用,以便我们可以使用 B 类中定义的方法。

所以我假设你有这种情况

public void doStuff(A aType){
   ...
   B bType = (B) aType;
   ...
}

如果这是真的,这能行吗?

private <T extends B & A> void example(T type){
    type.aStuff();
    type.doBStuff();
}

我创建了以下内容来测试它。

public class Foo{
  private static interface A{ 
    void aStuff();
  }

  private static class B{ 
    public void doBStuff(){ 
        System.out.println("B stuff");
    } 
  }

  private static class AB extends B implements A{
    public void aStuff(){
        System.out.println("A stuff");
    }
  }

  public static void main(String[] args) {
    Foo foo = new Foo();
    foo.example(new AB());
  }

  // method "example" already given
}

给我

一个东西
B 东西

【讨论】:

  • 这可能有效。我不知道你能做到这一点。但也许我们应该重新设计一下,因为它比它需要的更复杂。到目前为止,我只是在界面中重复了该方法。也许我会再看一下,看看在 A 和 B 中都有它是否有任何真正的价值。我实际上覆盖了子类中的方法只是为了调用 super 因为如果你在 Eclipse 中搜索使用 A 中的方法,你不会看到使用 B 引用调用它的实例。太糟糕了。
【解决方案2】:

为什么不创建一个扩展 B 并实现 A 的抽象类?假设这个类将被称为 C,您的其他类将扩展 C 并实现 A 所需的方法,但会为您提供 B 中可用的方法而无需强制转换。

我认为现在移动方法不是一个好主意,也许最多让 B 实现 A(假设你没有其他你没有谈到的依赖于你提到的类和接口的类) .

【讨论】:

  • A 太大了,B 无法实现它,但谢谢。我应该在示例中解释更多...
猜你喜欢
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2011-10-07
  • 2021-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
相关资源
最近更新 更多