接口和抽象类继承,在扩展类中实现

2022-08-30 12:57:16

在我见过的每个示例中,扩展类都实现了其父类的接口。作为参考,请看以下示例:

interface MyInterface{
    public function foo();
    public function bar();
}

abstract class MyAbstract implements MyInterface{
    public function foo(){ /* stuff */ }
    public function bar(){ /* stuff */ }
}

// what i usually see
class MyClass extends MyAbstract implements MyInterface{}

// what i'm curious about
class MyOtherClass extends MyAbstract{}

未能在子节点中实现由父级实现的接口是否被视为不良做法或其他做法?在子项中省略实现是否有任何技术缺陷?


答案 1

我认为你走在正确的道路上。在扩展已经存在接口的类时,无需声明您正在实现该接口。对我来说,如果需要更改,它只是另一段要维护的代码。所以,是的,你是对的!implements


答案 2

未能在子节点中实现由父级实现的接口是否被视为不良做法或其他做法?在子项中省略实现是否有任何技术缺陷?

我只是不能比这个家伙更好地回答你的问题:

就其本质而言,尽管有时它们可能看起来非常相似,但抽象类和类接口具有非常不同的目的。

类的接口旨在作为该类的“用户”的工具。接口是类的公共演示文稿,它应该向任何考虑使用它的人宣传哪些方法和常量是可用的,并且可以从外部访问。因此,顾名思义,它始终位于用户和实现它的类之间。

另一方面,抽象类是一种工具,旨在帮助扩展它的类的“实现者”。它是一个基础结构,可以对具体类的外观施加限制和指导。从类设计的角度来看,抽象类在体系结构上比接口更重要。在这种情况下,实现器位于抽象类和具体类之间,将后者构建在前者之上。

参考

因此,由您根据谁将使用(实例化)您的类以及谁将编写它们来决定。如果你是你的类的唯一用户和作者,那么,也许,只是也许,你不需要他们两者。但是,如果您想为类编写者和类用户提供精简到核心位的蓝图,那么您应该考虑同时使用抽象和实现。


推荐