Search code examples
oopsolid-principlesliskov-substitution-principle

Does adding public method to subclass violate LSP (Liskov substitution principle)?


If I add public method to subclass and a client program calls added method, client programs can't use parent object instead of subclass.

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()

This case violates LSP?


Solution

  • No as long as all the methods inherrited from the parent class follow the same contract as the parent then LSP is preserved.

    the whole point of LSP is to be able to pass around a subclass as the parent class without any problems. It says nothing about not being able to downcast for additional functionality.