【问题标题】:Extend an abstract class that extends another abstract class and need to override the interface the parent abstract class implements扩展一个抽象类,扩展另一个抽象类,需要重写父抽象类实现的接口
【发布时间】:2012-08-15 08:38:49
【问题描述】:

我有一个名为 Post 的实体类。 Post 的父级基于一个名为 AbstractPost 的抽象类。 AbstractPost 有一个变量“author”,其 setter 的签名定义在一个名为 PostInterface 的接口中。

我需要覆盖作者的设置器,但不想修改父母(当然)。

这些是父类:

class Post extends AbstractPost
abstract class AbstractPost implements PostInterface
interface PostInterface

我有以下课程:

class MyPost extends MyAbstractPost
abstract class MyAbstractPost extends AbstractPost implements MyPostInterface
interface MyPostInterface extends PostInterface

但是,我得到了错误:

致命错误:必须声明 MyAbstractPost::setAuthor() 与 PostInterface::setAuthor() 兼容

我读过孩子继承了父类的“实现”部分(这里的正确术语是什么?),所以我想我想知道如何覆盖它。还是我没有以正确的方式扩展/实施?

谢谢!

【问题讨论】:

  • setAuthor 方法中究竟需要改变什么?您收到该错误是因为您在接口中定义了方法签名,而您的其他类没有正确实现该方法。能把报错信息中提到的接口和抽象类里面的代码贴出来吗?
  • 你不能。如果你有——这是一种设计味道——你需要引入一个新的代理方法。
  • @delete-me-please 好的,我该怎么做?
  • @delete-me-please:关于设计:父类的创建者将作者定义为字符串。但是我希望它是一个 user_id。我不知道有任何其他方法可以做到这一点(除了将作者字段留空,这很奇怪恕我直言)
  • 代理方法与任何其他方法一样,您只需在应用必要的更改后调用“实际方法”美白您的方法,您没有为我或其他任何人提供足够的设计信息给你一个准确的解决方案。

标签: php inheritance interface


【解决方案1】:

答案是否定的。

重载方法签名会破坏拥有接口的目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多