4

如果我将公共方法添加到子类并且客户端程序调用添加的方法,则客户端程序不能使用父对象而不是子类。

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?

4

2 回答 2

5

不,只要从父类继承的所有方法都遵循与父类相同的约定,那么 LSP 就会被保留。

LSP 的重点是能够毫无问题地将子类作为父类传递。它没有说明不能为附加功能而沮丧。

于 2014-06-25T18:11:28.510 回答
1

向子类添加方法不会违反 LSP。但是,如果您通过从父类向下转换来调用该方法,则它确实违反了。

Robert C. Martin在他的LSP / SOLID 论文的开头指出:

根据对象的类型选择功能

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

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

于 2017-02-20T00:54:35.703 回答