Java 关于接口和扩展
假设我有一个带有方法Java 关于接口和扩展,java,oop,solid-principles,Java,Oop,Solid Principles,假设我有一个带有方法A的接口A,而B是一个实现A的具体类 public interface A { public void a(); } public class B implements A { public void a() { // implementation } } 现在假设有一个类C,它希望重用类B的实现,但它也希望引入新的行为,因此它添加了一个额外的方法C,并扩展了类B public class C extends B { pub
A
的接口A
,而B
是一个实现A
的具体类
public interface A {
public void a();
}
public class B implements A {
public void a() {
// implementation
}
}
现在假设有一个类C
,它希望重用类B
的实现,但它也希望引入新的行为,因此它添加了一个额外的方法C
,并扩展了类B
public class C extends B {
public void c() {
//implementation
}
}
现在,由于类C
的类型实际上是A
,因此基于SOLID原则中的依赖倒置原则,在调用类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中的依赖倒置原则,或者在这种情况下,正确的类层次结构应该是什么 我是否误解了SOLID中的依赖倒置原理 我想说的是你们把它和 我肯定你的问题是重复的,但我不知道如何寻找它们。当有人发现一个重复的,我会删除这个答案 根据您问题中的代码:
A对象=新C();
变量
对象的“类型”是A
。因此,它只能在编译时访问类A
的方法和成员。方法public void c()对于类型A的对象不可见,这就是为什么会出现编译时错误。要使用它,您需要在接口A中添加抽象方法。
public interface A {
public void a();
}
public class B implements A {
public void a() {
// implementation
}
}
您的界面应该如下所示:
public interface A {
public void a();
public void c();
}
由于您的类B也在实现接口A,现在您可以执行以下操作之一:
使B类抽象化
在类B中实现方法public void c()
现在,下面的代码将执行c类的public void c()方法
A object = new C();
object.c(); // call method from class C
第一个问题是在D
中实例化newc()
违反了依赖项反转,因为C
是一个具体的类,依赖项不能指向具体的实现。在调用像c()
这样的方法之前,必须先解决这个问题。