| ★ wanayoo — archive 1999 http://javaboutique.webdeveloper.com/tutorials/JavaOO/LSP.html | Nouvelle recherche | Portail wanayoo |
| ||||||||||||||
Tutorials : Liskov's Substitution Principle :LSP compliant solutionOne of the main lessons I learned is that sub-typing needs to be done with respect to the behaviour of the types and not with respect to the data only. In this aspect, the SpecialCurrentAccount IS NOT A CurrentAccount. A banker will shout at me for sure if I say this to him. But for you the intelligent programmers this would make sense. This is because they do not exhibit the same behaviour against the same message. I decided to break the hierarchy and come up with is new design with Account as an abstract base type and CurrentAccount and SpecialCurrentAccount as its sub-types. The abstract Account class declares an abstract method closeAccount(), which is implemented by both CurrentAccount and SpecialCurrentAccount. I have now changed the interface class to accept an Account type of Object as opposed a particular type of Account Object. The new interface class looked like this. public boolean closeAnAccount(Account ac) With this hierarchy, what may surprise you is that we have not changed the implementation of the closeAccount() method in any of the classes. The pre-conditions and the post-conditions remain the same. But in essence, what has happened is that the user will not make any assumption about the behaviour of the account object he is dealing with. This makes the module more maintainable and reusable in the sense that now it is very easy to add another type of account which may impose some other pre-condition and post-condition without breaking the LSP and Design by Contract. No overriding!!!It may seem from the above discussion that overriding is the main problem with LSP and in that case inheritance makes no sense. To some extent, it is puzzling but always keep the Design by Contract principle in mind before you override. If you are unable to comply with the same, then it might be worth revisiting your class diagrams. Always make sure that the derived class must enforce less strict pre-conditions while overriding any base class method. Try to think about the situation on your own and surely you will come up with some logic why LSP is so important for a good OO design. Next monthNext month, look forward to some of the other important principles of the OO design. Hope this series will help you design a better Object Oriented Software.
How to Add Java Applets to Your SiteNew on the Java Boutique:
New Article:
New Tutorial: Elsewhere on internet.com:
WebDeveloper Java
WDVL Java
ScriptSearch Java |
| |||||||||||||
