Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于接口和扩展_Java_Oop_Solid Principles - Fatal编程技术网

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()
    这样的方法之前,必须先解决这个问题。