[英]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.