关于接口和扩展
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,现在您可以执行以下操作之一:
- 制作classB摘要
- 在class B
中实现方法public void c()
现在下面的代码将执行 class C 的 public void c() 方法
A object = new C();
object.c(); // call method from class C
假设我有一个带有方法 a
的接口 A
,并且 B
是一个实现 A
.
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,现在您可以执行以下操作之一:
- 制作classB摘要
- 在class B 中实现方法public void c()
现在下面的代码将执行 class C 的 public void c() 方法
A object = new C();
object.c(); // call method from class C