首页 > 解决方案 > 方法覆盖并遵循 SOLID 原则

问题描述

我有一个父类和一个子类,如下所示:

class Request {
  public function handleException() : array {
    throw new Exception( 'RequestException' );
  }
}
class SpecialRequest extends Request {
  public function handleException() : array {
    if (condition) {
      return [];
    }
    parent::handleException();
  }
}

我有 2 个请求类,并且有一个用于返回数组的 handleException 方法。我的想法是父类只会抛出异常(因为它不知道如何处理它们)。虽然允许子类覆盖父方法以处理某些情况,否则抛出父异常。

遵循 SOLID 原则,我不应该在覆盖时更改方法签名。但是看看父方法,该方法有一个数组返回类型似乎很奇怪,而它基本上只是抛出一个异常。

上课有什么问题吗?

标签: phpoverridingsolid-principlesliskov-substitution-principle

解决方案


Request 类中的那个实现看起来应该抛出 NotImplementedException。然而,这通常是一个巨大的代码异味,表明一个糟糕的抽象。就像你有一只玩具狗和一只真正的狗实现了相同的接口,因为它们都是带有方法 acceptBatteries 的“狗”。玩具狗会接受电池,而真正的狗会抛出异常。只是一个糟糕的抽象——违反了 LSP。

编辑:如果请求类是抽象的并且处理异常方法是抽象的。


推荐阅读