假設我正在編寫一個Form
類的webapp,並且Form
類可以有幾個Fields
。如果Field> CharField> EmailField,EmailField是否打破Liskov與CharField的替代原則?
Field
本身是一個抽象類。它包含一個抽象的validators
屬性,它是一個方法列表,它將調用以確定該字段的內容是否有效。這些驗證器通過實例方法調用Field.run_validators(value)
CharField
是一個允許任意文本的Field
子類。這個字段總是有效的,只要給它一些非零長度的字符串即可。
EmailField
是具有附加要求的CharField
子類。此字段僅在value
通過某種測試時有效。 (例如'@' in value
)。
我的問題在於:EmailField
相對於CharField
打破了LSP嗎?它應該是兄弟會的班級嗎?儘管Field
通過允許子類自己提供validators
來定義可變性,但是TextField
並未明確地擴展該可變性。
我一直試圖找到LSP的更多解釋,但它們都重複使用相同的矩形/方形示例。
考慮:
def transmogulate(field):
"""field must be a TextField instance."""
assert isinstance(field, TextField)
instance.run_validators("hello")
當使用CharField
,transmogulate(my_text_field)
將沒有問題運行。但是,如果my_text_field
是EmailField
的實例,它將始終提高ValidationError
。這是否違反LSP?或者我的推理完全倒退? (這經常發生)
你也可以像開心地想象run_validators()
返回False
而不是引發異常,如果這改變了分析,我只是想讓我的例子儘可能地接近原始資料。
只要它工作誰關心? – clavio