11 - inheritance & polymorphism -...
TRANSCRIPT
![Page 1: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/1.jpg)
inheritance & polymorphism
![Page 2: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/2.jpg)
learning objectives
learn how to factor code thanks to inheritance
learn how to override constructors and methods
learn about subclassing, subtyping & polymorphism
hardware
your software
algorithms
system software
![Page 3: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/3.jpg)
a vintage examplecatalog of books & vinyls
title author rating
title artist
duration rating
list of books list of vinyls
![Page 4: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/4.jpg)
a vintage examplecatalog of books & vinyls
Booktitle author rating
init rate printInfo
Vinyltitle artist duration rating
init rate printInfo
Catalogbooks vinyls
addBook addVinyl listInfo
![Page 5: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/5.jpg)
:Catalog
books
vinyls
a vintage examplecatalog of books & vinyls
:Book
title
author
rating
"Hamlet"
"Shakespeare"★★★
:Book
title
author
rating
"Bible"
"God"★★★★
:Vinyl
title
author
duration
rating
"Abbey Road"
"Beatles"
★★★★47
:Vinyl
title
author
duration
rating
"Synchronicity"
"Police"
★★★40
:List
:List
![Page 6: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/6.jpg)
class Book: def __init__(self, title, author): self.title = title self.author = author self.rating = -1 def rate(self, rating): self.rating = rating def printInfo(self): rating = "?" if self.rating >= 0: rating = "" for i in range(0, self.rating): rating = rating + "*" print("Book[title: {0} | author: {1} | rating: {2}]" .format(self.title, self.author, rating))
catalog of books & vinyls
class Vinyl: def __init__(self, title, artist, duration): self.title = title self.artist = artist self.duration = duration self.rating = -1 def rate(self, rating): self.rating = rating def printInfo(self): rating = "?" if self.rating >= 0: rating = "" for i in range(0, self.rating): rating = rating + "*" print("Vinyl[title: {0} | artist: {1} | duration: {2} minutes | rating: {3}]" .format(self.title, self.artist, self.duration, rating))
![Page 7: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/7.jpg)
class Catalog: def __init__(self): self.books = [] self.vinyls = [] def addBook(self, book): self.books.append(book) def addVinyl(self, vinyl): self.vinyls.append(vinyl) def listInfo(self): print("BOOKS") for b in self.books: b.printInfo() print("------") print("VINYLS") for v in self.vinyls: v.printInfo()
c = Catalog()b1 = Book("Bible", "God")b1.rate(3) b2 = Book("Hamlet", "Shakespeare")c.addBook(b1)c.addBook(b2)v1 = Vinyl("Abbey Road", "Beatles", 47)v2 = Vinyl("Synchronicity", "Police", 40)c.addVinyl(v1)c.addVinyl(v2)c.listInfo()
BOOKS Book[title: Bible | author: God | rating: ***] Book[title: Hamlet | author: Shakespeare | rating: ?] ------ VINYLS Vinyl[title: Abbey Road | artist: Beatles | duration: 47 minutes | rating: ?] Vinyl[title: Synchronicity | artist: Police | duration: 40 minutes | rating: ?]
catalog of books & vinyls
![Page 8: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/8.jpg)
class Book { let title: String let author: String var rating: Int init(title: String, author: String) { self.title = title self.author = author self.rating = -1 } func rate(rating: Int) { self.rating = rating } func printInfo() { var rating = "?" if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Book[title: \(self.title) | author: \(self.author) | rating: \(rating)]") } }
catalog of books & vinyls
![Page 9: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/9.jpg)
class Vinyl { let title: String let artist: String let duration: Int var rating: Int init(title: String, artist: String, duration: Int) { self.title = title self.artist = artist self.duration = duration self.rating = -1 } func rate(rating: Int) { self.rating = rating } func printInfo() { var rating = "?" if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Vinyl[title: \(self.title) | artist: \(self.artist) | duration: \(self.duration) minutes | rating: \(rating)]") } }
catalog of books & vinyls
![Page 10: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/10.jpg)
class Catalog { var books: [Book] = [] var vinyls: [Vinyl] = [] func addBook(book:Book) { books.append(book) } func addVinyl(vinyl:Vinyl) { vinyls.append(vinyl) } func listInfo() { print("BOOKS") for b in books { b.printInfo() } print("------") print("VINYLS") for v in vinyls { v.printInfo() } } }
catalog of books & vinyls
let c = Catalog()
let b1 = Book(title:"Bible", author:"God") b1.rate(rating:3) let b2 = Book(title:"Hamlet", author:"Shakespeare")
c.addBook(book: b1) c.addBook(book: b2)
let v1 = Vinyl(title:"Abbey Road", artist:"Beatles", duration:47) let v2 = Vinyl(title:"Synchronicity", artist:"Police", duration:40)
c.addVinyl(vinyl: v1) c.addVinyl(vinyl: v2)
c.listInfo()
BOOKS Book[title: Bible | author: God | rating: ***] Book[title: Hamlet | author: Shakespeare | rating: ?] ------ VINYLS Vinyl[title: Abbey Road | artist: Beatles | duration: 47 minutes | rating: ?] Vinyl[title: Synchronicity | artist: Police | duration: 40 minutes | rating: ?]
![Page 11: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/11.jpg)
code duplication
class Vinyl { let title: String let artist: String let duration: Int var rating: Int init(title: String, artist: String, duration: Int) { self.title = title self.artist = artist self.duration = duration self.rating = -1 } func rate(rating: Int) { self.rating = rating } func printInfo() { var rating = "?" if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Vinyl[title: \(self.title) | artist: \(self.artist) | duration: \(self.duration) minutes | rating: \(rating)]") } }
class Book { let title: String let author: String var rating: Int
init(title: String, author: String) { self.title = title self.author = author self.rating = -1 }
func rate(rating: Int) { self.rating = rating } func printInfo() { var rating = "?" if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Book[title: \(self.title) | author: \(self.author) | rating: \(rating)]") } }
the Vinyl and Book classes are very similar
what's wrong?
![Page 12: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/12.jpg)
class Catalog { var books: [Book] = [] var vinyls: [Vinyl] = [] func addBook(book:Book) { books.append(book) } func addVinyl(vinyl:Vinyl) { vinyls.append(vinyl) } func listInfo() { print("BOOKS") for b in books { b.printInfo() } print("------") print("VINYLS") for v in vinyls { v.printInfo() } } }
code duplication...also in the Catalog class
maintenance is made difficult
great danger of introducing bugs when evolving
![Page 13: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/13.jpg)
great danger of introducing bugs when evolving
create a Game class with many similarities to the Book and Vinyl classes
add a games field in Catalog initialize it in the
constructor in Catalog
add a loop in the listInfo() method of Catalog
add an addGame() method in Catalog
assume we want to support games in v2.0
![Page 14: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/14.jpg)
solution: inheritance
![Page 15: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/15.jpg)
allows us to define oneclass, the subclass, as an extension ofanother, the superclass
inheritance
![Page 16: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/16.jpg)
inherit s all fields and methods from it s superclass
superclassdefines common attributes
subclassesdefines specific attributes
inheritance
![Page 17: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/17.jpg)
inheritance
Booktitle author rating
init rate printInfo
Vinyltitle artist duration rating
init rate printInfo
common attributes
![Page 18: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/18.jpg)
Booktitle author rating
init rate printInfo
Vinyltitle artist duration rating
init rate printInfo
inheritance
create a superclass
Medium
![Page 19: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/19.jpg)
subclasses inherit common attributes from the superclass and define their specific attributes
Bookauthor
init
Vinylartist duration
init
Mediumtitle rating
init rate printInfo
inheritance
promote common
attributes to the
superclass
![Page 20: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/20.jpg)
class Medium: def __init__(self, title): self.title = title self.rating = -1 def rate(self, rating): self.rating = rating def printInfo(self): rating = "?" if self.rating >= 0: rating = "" for i in range(0, self.rating): rating = rating + "*" print("Medium[title: {0} | rating: {1}]".format(self.title, rating))
inheritance
class Book(Medium): def __init__(self, title, author): self.author = author super().__init__(title)
class Vinyl(Medium): def __init__(self, title, artist, duration): self.artist = artist self.duration = duration super().__init__(title)
class Catalog: def __init__(self): self.media = [] def addMedium(self, medium): self.media.append(medium) def listInfo(self): print("MEDIA") for m in self.media: m.printInfo()
c = Catalog() b = Book("Hamlet", "Shakespeare")v = Vinyl("Abbey Road", "Beatles", 47) b.rate(3)c.addMedium(b)c.addMedium(v)c.listInfo()
![Page 21: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/21.jpg)
class Medium { let title: String var rating: Int init(title: String) { self.title = title self.rating = -1 } func rate(rating: Int) { self.rating = rating } func printInfo() { var rating = "?" if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Medium[title: \(self.title) | rating: \(rating)]") } }
inheritance
class Book : Medium { let author: String init(title: String, author: String) { self.author = author super.init(title: title) } }
class Vinyl : Medium { let artist: String let duration: Int
init(title: String, artist: String, duration: Int) { self.artist = artist self.duration = duration super.init(title: title) } }class Catalog {
var media: [Medium] = []
func addMedium(medium:Medium) { media.append(medium) }
func listInfo() { print("MEDIA") for m in media { m.printInfo() } } }
let c = Catalog() let b = Book(title:"Bible", author:"God") let v = Vinyl(title:"Abbey Road", artist:"Beatles", duration:47) b.rate(rating:3)
c.addMedium(medium: b) c.addMedium(medium: v)
c.listInfo()
![Page 22: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/22.jpg)
calling the superclass constructor
this is necessary to initialize the fields inherited from
the superclass
![Page 23: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/23.jpg)
subtypingclass Catalog { ... func addBook(book:Book) {...} func addVinyl(vinyl:Vinyl) {...} ... }
class Catalog { ... func addMedium(medium:Medium) {...} ... }
let c = Catalog() let b = Book(title:"Bible", author:"God") let v = Vinyl(title:"Abbey Road", artist:"Beatles", duration:47)
c.addMedium(medium: b) c.addMedium(medium: v)
before after
![Page 24: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/24.jpg)
classes define types
a geeka person with a devotion to something in a way that places him or her
outside the mainstream* *wikipedia
![Page 25: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/25.jpg)
subclasses define subtypes
![Page 26: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/26.jpg)
substitution principleobjects of subtypes can be used where object s
of supertypes are required
![Page 27: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/27.jpg)
polymorphic variablesobject variables are
polymorphic because they can hold object s of more
than one type
they can hold object s of the declared type (Medium), or of subtypes of the
declared type (Book, Vinyl)
![Page 28: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/28.jpg)
var b = Book(title:"Hamlet", author:"Shakespeare") var v = Vinyl(title:"Abbey Road", artist:"Beatles", duration:47) var m : Medium v = b
b = v
m = v
m = b
b = m
type casting
✔
✘
✘
✘
✔
b = m as! Book✔
the substitution principle only works... one way
![Page 29: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/29.jpg)
func listInfo() { print("MEDIA") for m in media { m.printInfo() } }
func printInfo() { var rating = "?"
if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Medium[title: \(self.title) | rating: \(rating)]") }
back to printing books and vinyls
Book Vinyl
Medium
printInfo
Catalog
Medium[title: Bible | rating: ***] Medium[title: Synchronicity | rating: ?]
the printInfo method in Medium only prints the
common fields
![Page 30: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/30.jpg)
the superclass knows nothing about the fields
of it s subclasses
the probleminheritance is a one-way street: a subclass inherit s
the superclass fields
![Page 31: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/31.jpg)
try tomove printInfo down to Book
and Vinyl
![Page 32: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/32.jpg)
func listInfo() { print("MEDIA") for m in media { m.printInfo() } }
func printInfo() { var rating = "?"
if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Medium[title: \(self.title) | rating: \(rating)]") }
printing books & vinyls
Book
printInfo
Vinyl
printInfo
Medium
Catalog
the Catalog cannot find a printInfo method in Medium
![Page 33: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/33.jpg)
var m : Medium = Book(title:"Hamlet", author:"Shakespeare")
back to polymorphismstatic type vs dynamic type
var b : Book = Book(title:"Hamlet", author:"Shakespeare")
what's the type of variable b ?
var m : Medium = Book(title:"Hamlet", author:"Shakespeare")
what's the type of variable m ?
static type dynamic type
![Page 34: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/34.jpg)
back to polymorphism
func listInfo() { print("MEDIA") for m in media { m.printInfo() } }
Book
printInfo
Vinyl
printInfo
Medium
compile-timeerror!
var m : Medium = Book(title:"Hamlet", author:"Shakespeare")
what's the type of variable m ?
![Page 35: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/35.jpg)
Solutionback to work
![Page 36: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/36.jpg)
try toadd printInfo to Medium, Book and
Vinyl
![Page 37: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/37.jpg)
override func printInfo() { print("Book[author: \(self.author)]") }
override func printInfo() { print("Vinyl[artist: \(self.artist) | Duration: \(self.duration)]") }
func listInfo() { print("MEDIA") for m in media { m.printInfo() } }
func printInfo() { var rating = "?"
if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Medium[title: \(self.title) | rating: \(rating)]") }
printing books & vinyls
Book
printInfo
Vinyl
printInfo
Medium
printInfo
Book[author: Shakespeare] Vinyl[artist: Beatles | Duration: 47]
Catalog
no longer printingcommon fields
![Page 38: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/38.jpg)
the problemwhen overriding a
method in a subclass (Book or Vinyl), the
inherited method from the super class is
hidden
:Book
title
author
rating
"Hamlet"
"Shakespeare"★★★
Book
printInfo
Medium
printInfo
func listInfo() { print("MEDIA") for m in media { m.printInfo() } }
is an
insta
nce
of
this oneis called
![Page 39: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/39.jpg)
the problem
:Book
title
author
rating
"Hamlet"
"Shakespeare"★★★
Book
printInfo
Medium
printInfo
func listInfo() { print("MEDIA") for m in media { m.printInfo() } }
is an
insta
nce
ofthis oneis called
when overriding a method in a subclass (Book or Vinyl), the
inherited method from the super class is
hidden
![Page 40: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/40.jpg)
Solutionalmost there
![Page 41: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/41.jpg)
solutioncall super
![Page 42: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/42.jpg)
override func printInfo() { super.printInfo() print("Book[author: \(self.author)]") }
override func printInfo() { super.printInfo() print("Vinyl[artist: \(self.artist) | Duration: \(self.duration)]") }
func listInfo() { print("MEDIA") for m in media { m.printInfo() } }
func printInfo() { var rating = "?"
if (self.rating >= 0) { rating = "" for i in 1...self.rating { rating = rating + "*" } } print("Medium[title: \(self.title) | rating: \(rating)]") }
printing books & vinyls
Book
printInfo
Vinyl
printInfo
Medium
printInfo
Catalog
Medium[title: Hamlet | rating: ?] Book[author: Shakespeare]
Medium[title: Abbey Road | rating: ?] Vinyl[artist: Beatles | Duration: 47]
![Page 43: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/43.jpg)
for example in Python and in Scala, all object s, inherit from a method to represent themselves
as strings and can override it
the object superclass
so methods in Object are inherited by all classes and can be overridden by any subclasses
in most object-oriented languages, all classes have an implicit superclass, the Object class
class Medium { override def toString: String = {"I am a Medium"} }
class Medium: def __str__(self): return "I am a Medium"
![Page 44: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/44.jpg)
class Medium: ... def __str__(self): rating = "?" if self.rating >= 0: rating = "" for i in range(0, self.rating): rating = rating + "*" return "title: {0} | rating: {1}".format(self.title, rating) def printInfo(self): print(str(self))
one last time
back to printing books and vinyls
class Vinyl(Medium): ... def __str__(self): return "Vinyl[artist: {0} | duration: {1} minutes | {2}]".format(self.artist, self.duration, super().__str__())
class Book(Medium): ... def __str__(self): return "Book[author: {0} | {1}]".format(self.author, super().__str__())
Book[author: God | title: Bible | rating: ***] Book[author: Shakespeare | title: Hamlet | rating: ?] Vinyl[artist: Beatles | duration: 47 minutes | title: Abbey Road | rating: ?] Vinyl[artist: Police | duration: 40 minutes | title: Synchronicity | rating: ?]
!I promise
![Page 45: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/45.jpg)
class Medium: ... def __str__(self): rating = "?" if self.rating >= 0: rating = "" for i in range(0, self.rating): rating = rating + "*" return "title: {0} | rating: {1}".format(self.title, rating) def printInfo(self): print(str(self))
one last time
back to printing books and vinyls
class Vinyl(Medium): ... def __str__(self): return "Vinyl[artist: {0} | duration: {1} minutes | {2}]".format(self.artist, self.duration, super().__str__())
class Book(Medium): ... def __str__(self): return "Book[author: {0} | {1}]".format(self.author, super().__str__())
Book[author: God | title: Bible | rating: ***] Book[author: Shakespeare | title: Hamlet | rating: ?] Vinyl[artist: Beatles | duration: 47 minutes | title: Abbey Road | rating: ?] Vinyl[artist: Police | duration: 40 minutes | title: Synchronicity | rating: ?]
!I promise
![Page 46: 11 - Inheritance & Polymorphism - doplab.unil.chdoplab.unil.ch/wp-content/uploads/2018/12/11-Inheritance-Polymorphism.pdf · learning objectives learn how to factor code thanks to](https://reader030.vdocument.in/reader030/viewer/2022040207/5e17f064722bc124290b7594/html5/thumbnails/46.jpg)