1

假设我正在编写一个带有Form类的 webapp,而一个Form类可以有多个Fields.

Field本身就是一个抽象类。它包含一个抽象validators属性,它是一个方法列表,它将调用以确定字段的内容是否有效。这些验证器通过调用实例方法来调用Field.run_validators(value)

CharField是一个Field允许任意文本的子类。这个字段总是有效的,只要给它一些非零长度的字符串。

EmailFieldCharField具有附加要求的子类。此字段仅在value通过一组某种测试时才有效。(例如'@' in value)。

我的问题是:是否会EmailField破坏 LSP CharField?它应该是一个兄弟类吗?尽管Field通过允许子类提供自己的 来定义可变性validatorsTextField但并未明确扩展该可变性。

我一直试图找到更多关于 LSP 的解释,但它们都重用了相同的 Rectangle/Square 示例。

鉴于:

def transmogulate(field):
    """field must be a TextField instance."""
    assert isinstance(field, TextField)
    instance.run_validators("hello")

使用时CharFieldtransmogulate(my_text_field)将毫无问题地运行。但是如果my_text_field是一个实例EmailField,它总是会引发一个ValidationError. 这是否违反了 LSP?还是我的推理完全倒退了?(这经常发生)

如果以某种方式改变分析,您也可以愉快地想象run_validators()返回False​​而不是引发异常;我只是想让我的示例尽可能接近源材料。

4

1 回答 1

0

我认为只要 EmailField 提供与 CharField 相同的方法(看起来确实如此),设计就可以了。如果它仍然像鸭子一样嘎嘎叫,它会跟随 LSP。子类可以有不同的实现或行为。

于 2013-06-11T15:57:19.533 回答