【问题标题】:Does adding public method to subclass violate LSP (Liskov substitution principle)?向子类添加公共方法是否违反 LSP(Liskov 替换原则)?
【发布时间】:2014-08-16 00:30:23
【问题描述】:

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

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说子类可以代替父类,并不是说父类可以代替子类。
  • 这是什么语言?
  • @weston 这个语言是 Python

标签: oop solid-principles liskov-substitution-principle


【解决方案1】:

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

LSP 的全部意义在于能够毫无问题地将子类作为父类传递。它没有说明不能为附加功能而沮丧。

【讨论】:

    【解决方案2】:

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

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

    根据对象的类型选择函数

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      • 2012-10-08
      • 2021-11-17
      • 2011-09-09
      • 2012-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多