【问题标题】:if class B implements interface C, and class A extends B, does class A need to implement C too? [duplicate]如果B类实现接口C,A类扩展B,A类也需要实现C吗? [复制]
【发布时间】:2018-01-25 08:48:26
【问题描述】:

我正在查看一些代码并偶然发现:

export class A extends B implements C {
  ...
}

然后是另一个类

export abstract class B implements C {
  ...
}

然后我想,如果A类扩展了B,而B已经实现了接口C(如下图),那A是否也需要实现C呢?

我希望我说清楚了,不要太复杂。

谢谢!

【问题讨论】:

  • 不,没必要。
  • export 不是 Java 类的有效修饰符。除此之外,当A 扩展B 时,它会隐式实现C
  • 不,它会隐式实现C类,因为它在超类B中。

标签: typescript inheritance extends implements


【解决方案1】:

B 被扩展并实现C 时,您不需要实现C。它在A 扩展B 时隐式实现。

虽然这样做也没有什么问题(它不会让程序崩溃)


另外,export 不是 Java 中的有效关键字。在使用方面,我得到的最接近的与 TypeScript 有关。您可能正在寻找 public 代替

【讨论】:

  • 好的,我在做这个问题时很困惑,它确实是打字稿,我现在编辑它,谢谢!这就是我一直在寻找的答案:D
【解决方案2】:

如果class A extends Bclass B implements C,类A 实现接口C,并且不必显式声明implements C

但是,添加这样的implements C 是 JDK 类中的常见做法。

例如:

class ArrayList<E> extends AbstractList<E> implements List<E>

可能看起来是多余的,因为AbstractList 已经实现了List

class AbstractList<E> extends AbstractCollection<E> implements List<E>

但是,ArrayList 类的用户可以立即看到它实现了List 接口,而无需查看AbstractList 类(这是一个实现细节)。

【讨论】:

    【解决方案3】:

    如果类 B 实现类 C,类 A 扩展 B,那么类 A 还需要实现C吗?

    首先,class 永远不能实现不同的class。他们扩展它。 class 只能实现 interfaces

    现在,无论您实现和/或扩展什么,classinterface 都成为同一层次结构的一部分。

    B类实现C接口时

    abstract class B implements C
    

    然后,您不需要再次实现类A,因为您已经扩展了类B,并且类B实现了C

    class A extends B
    

    【讨论】:

    • @nbokmans 你在说什么。请仔细阅读我的回答。
    • 首先 - 那么你的答案的另一部分在哪里?
    • @Rafalon 更新伙伴:P
    • @Rafalon 它在几分钟内收到了大约 3 次编辑,它在完成之前就发布了
    • 是的,我听错了,C确实是一个接口,谢谢解释!
    【解决方案4】:

    首先,@nbokmans 是对的。 export 不是 Java 关键字。

    然后我想,如果 A 类扩展了 B,而 B 已经实现了 C(如 如下所示),A是否也需要实现C?

    没有必要,因为类继承在 Java 中是可传递的。

    Chapter 8. Classes. 8.1.4. Superclasses and Subclasses

    子类关系是直接的传递闭包 子类关系。 A 类是 C 类的子类,如果其中任何一个 以下是正确的:

    • A 是 C 的直接子类

    • 存在一个 B 类,A 是 B 的子类,B 是 C 的子类,递归地应用这个定义。

    现在明确说明:

    class A extends B implements C {
    

    如果A 成为其他应用程序使用的 API 的一部分,则有意义。
    它将C 明确记录为A 实现的接口。

    【讨论】:

    • 以为C是一个界面,还是我误解了你的最后两个字?
    • @Rafalon 你是对的。令人困惑。
    【解决方案5】:

    让我们的接口被定义如下

    interface C {
        public void fun();
    }
    

    由于 B 类实现了接口 C,因此在 B 类中必须实现方法 fun()。但是由于该类被定义为抽象类,因此可以跳过方法 fun() 的实现,因为子类可以提供实现。

    abstract class B implements C {
    
    
    }
    

    现在由于类 A 扩展了 B,所以它也已经按照一般继承规则实现了接口 C。因此,没有明确要求 A 将实现 C 接口,但在语法上它是完全有效的。

    class A extends B {
    
        public void fun() {
    
        }
    }
    

    【讨论】: