向子类添加公共方法是否违反了LSP(Liskov替换原则)?

时间:2014-06-25 12:31:12

标签: oop solid-principles 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?

2 个答案:

答案 0 :(得分:5)

否,只要从父类继承的所有方法都遵循与父级相同的协定,则保留LSP。

LSP的全部意义是能够传递子类作为父类而没有任何问题。它没有说明无法降级其他功能。

答案 1 :(得分:1)

向子类添加方法不会违反LSP。但是,如果通过从父类中进行向下转换来调用该方法,则会违反

罗伯特·C·马丁在其LSP / SOLID paper的开头说明:

  

根据对象的类型选择一个函数

(...)是一个简单违反Liskov替代原则的例子。

通常情况下,如果您最终遇到需要向下转换或使用 instanceof 运算符的情况,最好重新使用继承来支持其他方法,例如组合物。