关于接口和扩展

About interface and extension

假设我有一个带有方法 a 的接口 A,并且 B 是一个实现 A.

的具体 class
public interface A {
    public void a();
}

public class B implements A {
    public void a() {
        // implementation
    }
}

现在假设有一个 class C 想要重用 class B 的实现,但它也想引入新的行为,所以它添加一个额外的方法 c 并且还扩展了 class B.

public class C extends B {
    public void c() {
        //implementation
    }
}

现在由于classC的类型实际上是A,所以根据SOLID原则中的依赖倒置原则,调用时似乎应该使用以下内容class C 的方法 c。但是调用将无效,因为接口 A 只有方法 a.

public class D {
    public void d() {
        A object = new C();
        object.c();  // cannot call as the interface A only has method a
    }
}

我是不是误解了 SOLID 中的依赖倒置原则,或者在这种情况下正确的 class 层次结构应该是什么?

您在问题中写道

Am I misunderstand the dependency inversion principle in SOLID

我会说你把它和 Liskov substitution principle 混淆了。

我确定您的问题是重复的,但我不知道如何搜索它们。当有人发现重复时,我会删除这个答案。

来自您问题中的代码:

A object = new C();

变量 object 的“类型”是 A。因此它只能访问 class A.

的方法和成员

在编译时方法 public void c() 对类型 A 的对象不可见,这就是为什么你会得到编译时错误。要使用它,您需要在接口 A 中添加抽象方法。 您的界面应如下所示:

public interface A {
    public void a();
    public void c();
}

由于您的 class B 也在实现接口 A,现在您可以执行以下操作之一:

  1. 制作classB摘要
  2. 在class B
  3. 中实现方法public void c()

现在下面的代码将执行 class C 的 public void c() 方法

A object = new C();
object.c(); // call method from class C