[英]Does `instanceof` operator violate Liskov Substitution Principle?
[英]Does adding public method to subclass violate LSP (Liskov substitution principle)?
如果我将子方法添加到子类并且客户端程序调用添加的方法,则客户端程序不能使用父对象而不是子类。
import unittest
class BaseClass(object):
def doSomething(self):
pass
class SubClass(BaseClass):
def doStuff(self):
pass
class Client(object):
def __init__(self, obj):
self.obj = obj
def do(self):
self.obj.doStuff()
class LSPTestCase(unittest.TestCase):
def test_call_subclass_method(self):
client = Client(SubClass())
client.do()
def test_call_baseclass_method(self):
client = Client(BaseClass())
with self.assertRaises(AttributeError):
client.do()
if __name__ == '__main__':
unittest.main()
这种情况违反了LSP?
否,只要从父类继承的所有方法遵循与父类相同的协定,则保留LSP。
LSP的重点是能够作为父类传递子类而没有任何问题。 它没有说明无法降级其他功能。
向子类添加方法不会违反LSP。 但是,如果通过从父类中向下转换来调用该方法, 则会违反该方法。
罗伯特·C·马丁在其LSP / SOLID论文的开头就说 :
根据对象的类型选择一个函数
(...)是一个简单违反Liskov替代原则的例子。
通常,如果您最终遇到需要向下转换或使用instanceof运算符的情况 ,最好重新使用继承来支持其他方法,例如组合。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.