繁体   English   中英

工厂类方法是否违反了Liskov替代原理?

[英]Do factory class methods break the Liskov substitution principle?

我想知道工厂方法是否违反了Liskov替代原理

例如在以下Python代码中, Response.from_request工厂类方法是否破坏了它?

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的对象具有这两个特征,它就可以通过BaseResponse鸭子测试 如果它进一步实现任何其他方法,则无需担心。

因此,不,类方法不会破坏LSP。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM