繁体   English   中英

不违反 Liskov 替代原则的替代方案

[英]Alternative that doesn't violate the Liskov substitution principle

考虑以下类的结构:

from abc import ABC, abstractmethod


class ModelSettings(ABC):
    ...

class BlueModelSettings(ModelSettings):
    ...

class RedModelSettings(ModelSettings):
    ...


class Model(ABC):
    @abstractmethod
    def compute(self, settings: ModelSettings):
        ...

class BlueModel(Model):
    def compute(self, settings: BlueModelSettings):
        ...

class RedModel(Model):
    def compute(self, settings: RedModelSettings):
        ...

MyPy 抱怨BlueModelRedModel中的compute实现违反了 Liskov 替换原则。 我理解这一点,也理解它为什么有意义。

我的问题是,除了上述结构之外,还有什么方法可以满足以下要求:

  • 基本模型有一个合同, compute应该接收设置,而不是苹果或橘子
  • 但每个特定模型应该只接受与其自己的模型类型相关的设置

在某种程度上,我本质上希望子类的方法参数比它的基类规定的更严格,这直接违背了 Liskov 原则。 这就是告诉我可能有更合适的方法。

笔记:

  • Model是库代码,因此它不知道例如BlueModelSettings是客户端代码

您需要您的Modelsettings类型中是通用的。

T = TypeVar('T', bound=ModelSettings)

class Model(ABC, Generic[T]):
    @abstractmethod
    def compute(self, settings: T):
        ...

class BlueModel(Model[BlueModelSettings]):
    def compute(self, settings: BlueModelSettings):
        ...

class RedModel(Model[RedModelSettings]):
    def compute(self, settings: RedModelSettings):
        ...

暂无
暂无

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

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