工厂 class 方法是否违反了 Liskov 替换原则?

Do factory class methods break the Liskov substitution principle?

我想知道工厂 class 方法是否破坏了 Liskov substitution principle.

例如在下面的 Python 代码中,Response.from_request 工厂 class 方法会破坏它吗?

import abc


class BaseResponse(abc.ABC):

    @abc.abstractmethod
    def get_headers(self):
        raise NotImplementedError

    @abc.abstractmethod
    def get_body(self):
        raise NotImplementedError


class Response(BaseResponse):

    def __init__(self, headers, body):
        self.__headers = headers
        self.__body = body

    def get_headers(self):
        return self.__headers

    def get_body(self):
        return self.__body

    @classmethod
    def from_request(cls, request, payload):
        headers = request.get_headers()
        headers["meta_data"] = payload["meta_data"]
        body = payload["data"]
        return cls(headers, body)

替换原则说你需要能够用兼容类型(即子类型)的另一个对象替换一个对象,并且它的行为必须仍然相同。您需要从为特定对象键入提示的函数的角度来看:

def func(foo: BaseResponse):
    ...

此函数需要一个行为类似于 BaseResponse 的参数。那是什么行为?

  • get_headers()
  • get_body()

这是BaseResponse仅有的两种方法。只要你传递给func的对象有这两个特性,它就传递给BaseResponseduck test。如果它进一步实现任何额外的方法,那没有关系。

所以,不,class 方法不会破坏 LSP。