1 / 17

Design Points - Subclassing vs Subtyping

This article explores the differences between subclassing and subtyping in design, specifically focusing on the implementation of a Stack. It discusses the challenges and consequences of using subclassing and proposes a better approach using subtyping. The article also touches on the concepts of inheritance, polymorphism, and code reuse in relation to subclassing and subtyping.

smonzon
Download Presentation

Design Points - Subclassing vs Subtyping

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Design Points - Subclassing vs Subtyping Stéphane Ducasse --- 2010

  2. A little problem • How to implement a Stack?

  3. Stack subclass of OrderedCollection • Stack>>pop • ^ self removeFirst • Stack>>push: anObject • self addFirst: anObject • Stack>>top • ^ self first • Stack>>size, Stack>>includes: • are free, inherited from

  4. Wait! but • What do we do with all the rest of the interface of OrderedCollection? • a Stack IS NOT an OrderedCollection! • We cannot substitute an OrderedCollection by a Stack • Some messages do not make sense on Stack • Stack new addLast: anObject • Stack new last • So we have to block a lot of methods...

  5. Consequences... • Stack>>removeFirst • self shouldNotImplement • Stack>>pop • ^ super removeFirst

  6. The Problem • There is not a simple relationship between Stack and OrderedCollection • Stack interface is not an extension or subset of OrderedCollection interface • Compare with CountingStack a subclass of Stack • CountingStack interface is an extension of Stack interface

  7. Compare the two uses

  8. Compare the two replacements

  9. A Better Approach • By defining the class Stack that uses OrderedCollection • Object subclass: Stack • instVarNames: ‘elements’ • Stack>>push: anElement • elements addFirst: anElement • Stack>>pop • element isEmpty ifFalse: [^ element removeFirst]

  10. Inheritance and Polymorphism • Polymorphism works best with conforming/substituable interfaces • Inheritance creates families of classes with similar interfaces • An abstract class describes an interface fulfilled by its subclasses • Inheritance helps software reuse by making polymorphism easier

  11. About subtyping and subclassing • You have only extends or subclass: in programming language. • But they can be used to define a subclassing or subtyping relationship.

  12. Subtyping Inheritance • Reuse of specifications • A subclass refines superclass specifications • A program that works with Numbers will work with Fractions. • A program that works with Collections will work with Arrays.

  13. Subclassing • Inheritance for code reuse • Dictionary is a subclass of Set • Semaphore is a subclass of LinkedList • No relationship between the interfaces of the classes • Subclass reuses code from superclass, but has a different specification. It cannot be used everywhere its superclass is used. Usually overrides a lot of code. • ShouldNotImplement use is a bad smell…

  14. Inheritance for Code Reuse • Inheritance for code reuse is good for • rapid prototyping • getting application done quickly. • Bad for: • easy to understand systems • reusable software • application with long life-time.

  15. Subtyping Essence • You reuse specification • You should be able to substitute an instance by one of its subclasses (more or less) • There is a relationship between the interfaces of the class and its superclass

  16. How to Choose? • Favor subtyping • When you are in a hurry, do what seems easiest. • Clean up later, make sure classes use “is-a-subtype” relationship, not just “is-implemented-like”. • Is-a-subtype is a design decision, the compiler only enforces is-implemented-like!!!

  17. Quizz • Circle subclass of Point? • Poem subclass of OrderedCollection?

More Related