CPS 100 2.1 Anagram: Using Normalizers l How can we normalize an Anaword object differently?  Call normalize explicitly on all Anaword objects  Have.

Slides:



Advertisements
Similar presentations
The Bridge Pattern.. Intent Decouple an abstraction from its implementation so that the two can vary independently Also known as: Handle/Body.
Advertisements

9. Inheritance 9.1 Subclasses 9.2 Polymorphism 9.3 Abstract Classes 9.4 Modifiers and Access 9.6 Object-Oriented Design with Use Cases and Scenarios.
ITEC200 – Week03 Inheritance and Class Hierarchies.
Inheritance and Class Hierarchies Chapter 3. Chapter 3: Inheritance and Class Hierarchies2 Chapter Objectives To understand inheritance and how it facilitates.
C++ Polymorphism Systems Programming. Systems Programming: Polymorphism 2   Polymorphism Examples   Relationships Among Objects in an Inheritance.
Lecture 6: Polymorphism - The fourth pillar of OOP - 1.
Computer Science and Software Engineering University of Wisconsin - Platteville 7. Inheritance and Polymorphism Yan Shi CS/SE 2630 Lecture Notes.
CSE 332: C++ templates and generic programming I Motivation for Generic Programming in C++ We’ve looked at procedural programming –Reuse of code by packaging.
C++ Object Oriented 1. Class and Object The main purpose of C++ programming is to add object orientation to the C programming language and classes are.
1 Data Structures - CSCI 102 CS102 C++ Polymorphism Prof Tejada.
Inheritance in C++ CS-1030 Dr. Mark L. Hornick.
Dr. Ahmad R. Hadaegh A.R. Hadaegh California State University San Marcos (CSUSM) Page 1 Virtual Functions Polymorphism Abstract base classes.
Polymorphism &Virtual Functions
CISC6795: Spring Object-Oriented Programming: Polymorphism.
(C) 2010 Pearson Education, Inc. All rights reserved. Java™ How to Program, 8/e.
Lecture 9 Polymorphism Richard Gesick.
CSE 332: C++ templates This Week C++ Templates –Another form of polymorphism (interface based) –Let you plug different types into reusable code Assigned.
CPS What’s easy, hard, first? l Always do the hard part first. If the hard part is impossible, why waste time on the easy part? Once the hard part.
Inheritance Joe Meehean. Object Oriented Programming Objects state (data) behavior (methods) identity (allocation of memory) Class objects definition.
Inheritance and Class Hierarchies Ellen Walker CPSC 201 Data Structures Hiram College.
1 Chapter 10: Data Abstraction and Object Orientation Aaron Bloomfield CS 415 Fall 2005.
1 Java Inheritance. 2 Inheritance On the surface, inheritance is a code re-use issue. –we can extend code that is already written in a manageable manner.
Polymorphism, Inheritance Pt. 1 COMP 401, Fall 2014 Lecture 7 9/9/2014.
Object Oriented Programming with C++/ Session 6 / 1 of 44 Multiple Inheritance and Polymorphism Session 6.
Method Overriding Remember inheritance: when a child class inherits methods, variables, etc from a parent class. Example: public class Dictionary extends.
A Computer Science Tapestry 12.1 Tools for programming l Syntatic details of control and variables  If, while, switch, function calls  Scope and lifetime.
RIT Computer Science Dept. Goals l Inheritance l Modifiers: private, public, protected l Polymorphism.
1 Inheritance. 2 Why use inheritance?  The most important aspect of inheritance is that it expresses a relationship between the new class and the base.
Design Patterns Gang Qian Department of Computer Science University of Central Oklahoma.
Chapter 10 Inheritance and Polymorphism
Creational Pattern: Factory Method At times, a framework is needed to standardize the behavior of objects that are used in a range of applications, while.
CSE 332: Design Patterns Review: Design Pattern Structure A design pattern has a name –So when someone says “Adapter” you know what they mean –So you can.
Copyright © 2012 Pearson Education, Inc. Chapter 15: Inheritance, Polymorphism, and Virtual Functions.
1 Lecture 6: Polymorphism - The fourth pillar of OOP -
CPS What is Computer Science? What is it that distinguishes it from the separate subjects with which it is related? What is the linking thread.
Inheritance. Inheritance - Introduction Idea behind is to create new classes that are built on existing classes – you reuse the methods and fields and.
Object-Oriented Programming Chapter Chapter
Inheritance Revisited Other Issues. Multiple Inheritance Also called combination--not permitted in Java, but is used in C++ Also called combination--not.
APCS Workshop 1 Why is programming fun? What delights may its practitioner expect as a reward? First is the sheer joy of making things Second is the pleasure.
Object Oriented Programming
Interfaces About Interfaces Interfaces and abstract classes provide more structured way to separate interface from implementation
CPS Inheritance and the Yahtzee program l In version of Yahtzee given previously, scorecard.h held information about every score-card entry, e.g.,
C++ Inheritance Data Structures & OO Development I 1 Computer Science Dept Va Tech June 2007 © McQuain Generalization versus Abstraction Abstraction:simplify.
 In the java programming language, a keyword is one of 50 reserved words which have a predefined meaning in the language; because of this,
Interfaces F What is an Interface? F Creating an Interface F Implementing an Interface F What is Marker Interface?
Inheritance and Class Hierarchies Chapter 3. Chapter 3: Inheritance and Class Hierarchies2 Chapter Objectives To understand inheritance and how it facilitates.
Inheritance and Class Hierarchies Chapter 3. Chapter Objectives  To understand inheritance and how it facilitates code reuse  To understand how Java.
Quick Review of OOP Constructs Classes:  Data types for structured data and behavior  fields and methods Objects:  Variables whose data type is a class.
Overview of C++ Polymorphism
CompSci Reading from Files  import java.io.File;  Declare a file File fileOfCats = new File(”cats.txt”);  Use file – pass it as an argument to.
Recap Introduction to Inheritance Inheritance in C++ IS-A Relationship Polymorphism in Inheritance Classes in Inheritance Visibility Rules Constructor.
Author: DoanNX Time: 45’.  OOP concepts  OOP in Java.
CPS Anagram: Using Normalizers l How can we normalize an Anaword object differently?  Call normalize explicitly on all Anaword objects  Have.
Notices Assn 2 is due tomorrow, 7pm. Moodle quiz next week – written in the lab as before. Everything up to and including today’s lecture: Big Topics are.
Object-Oriented Programming Review 1. Object-Oriented Programming Object-Oriented Programming languages vary but generally all support the following features:
Abstract classes only used as base class from which other classes can be inherit cannot be used to instantiate any objects are incomplete Classes that.
Inheritance Modern object-oriented (OO) programming languages provide 3 capabilities: encapsulation inheritance polymorphism which can improve the design,
CMSC 202 Polymorphism.
7. Inheritance and Polymorphism
Inheritance and Polymorphism
Anagrams/Jumbles How do humans solve puzzles like that at
Polymorphism.
Review: Two Programming Paradigms
Week 6 Object-Oriented Programming (2): Polymorphism
CISC/CMPE320 - Prof. McLeod
Polymorphism CMSC 202, Version 4/02.
Overview of C++ Polymorphism
Java String Class String is a class
Lecture 6: Polymorphism
Static Binding Static binding chooses the function in the class of the base class pointer, ignoring any versions in the class of the object actually.
Presentation transcript:

CPS Anagram: Using Normalizers l How can we normalize an Anaword object differently?  Call normalize explicitly on all Anaword objects  Have Anaword objects normalize themselves  Advantages? Disadvantages? l If Anaword objects normalize themselves, how can we experiment with different normalization techniques?  Gut and paste. Problems? Versions? Saved code?  What about cp anaword.cpp oldanaword.cpp ?  What about deciding at runtime on normalization? l We need inheritance!

CPS Normalizer hierarchy l Anaword objects normalize themselves  Where does the normalizer come from? Passed in at construction time Obtained from normalizer factory Other approaches?  How is Normalizer used? l Normalizer is conceptually an interface  Different implementations of the interface have different behavior (guts) but same skin (sort of)

CPS Benefits of inheritance, interfaces l Suppose you learn about a new class WebStream that conforms to the input stream interface (cin, ifstream, …)  Read words, lines, chars from a web page? void readWords(istream& input) { string s, line; char ch; getline(input,line); input >> s; input.get(ch); } l We can pass cin, ifstream, WebStream, etc. to readWords  Why is this an advantage?  Inheritance and late/dynamic binding

CPS Why inheritance? l Add new shapes easily without changing much code  Shape * s1 = new Circle();  Shape * s2 = new Square(); l abstract base class:  interface or abstraction  pure virtual function l concrete subclass  implementation  provide a version of all pure functions l “is-a” view of inheritance  Substitutable for, usable in all cases as-a shape mammal ScoreEntry FullHouse, LargeStraight User’s eye view: think and program with abstractions, realize different, but conforming implementations, don’t commit to something concrete until as late as possible

CPS Example of inheritance l What is behavior of a shape? void doShape(Shape * s) { cout area() << endl; cout perimeter() << end; s->expand(2.0); cout area() << endl; cout perimeter() << endl; } Shape * s1 = new Circle(2); Shape * s2 = new Square(4); Shape * s3 = new Rectangle(2,5);d doShape(s1); doShape(s2); doShape(s3);

CPS Inheritance (language independent) l First view: exploit common interfaces in programming  Streams in C++, iterators in Tapestry classes Iterators in STL/C++ share interface by convention/templates  Implementation varies while interface stays the same l Second view: share code, factor code into parent class  Code in parent class shared by subclasses  Subclasses can override inherited method Can subclasses override and call? l Polymorphism/late(runtime) binding (compare: static)  Actual function called determined when program runs, not when program is compiled

CPS Inheritance Heuristics l A base/parent class is an interface  Subclasses implement the interface Behavior changes in subclasses, but there’s commonality  The base/parent class can supply some default behavior Derived classes can use, override, both l Push common behavior as high up as possible in an inheritance hierarchy l If the subclasses aren’t used polymorphically (e.g., through a pointer to the base class) then the inheritance hierarchy is probably flawed

CPS Normalizer details (see Anaword) l What’s static? Why private? Static initialization? class Anaword { public: // not shown private: void normalize(); static Normalizer * ourNormalizer; }; void Anaword::normalize() // postcondition: mySortedWord is sorted version of myWord { if (ourNormalizer == 0) { ourNormalizer = NormFactory::getNormalizer(); } myNormalizedWord = ourNormalizer->normalize(myWord); }

CPS Where are the objects in Yahtzee? l Similarities/differences in different scorecard entries?  Scoring?  Bonus? l How do we play a game?  Roll dice (one, two, …)  Make decision  Repeat  Decide where to score? l Inheritance: leverage differences in common behavior

CPS Objects, Classes, Tests l What classes have something to do with Dice?  What’s the behavior of a Dice (sp) and a DiceGroup?  What about testing scoring behavior with randomness?  See DiceGroup, FixedDice, CupOfDice classes What about ScoreCard and ScoreCardEntry ?  What behavior does a score card have?  Behavior of score card entry (small straight, chance, …) l What about Game behavior?  When do we stop playing?

CPS What’s a “traditional” ScoreEntry? class ScoreEntry { public: enum Kind{ ones, twos, threes, fours, fives, sixes, kind3, kind4, fullhouse, smallstraight, largestraight,yahtzee, chance }; ScoreEntry(Kind kind); void score(const DiceGroup& dg); // other methods/member functions here private: int myScore; ScoreEntry::Kind myKind; // what am I

CPS ScoreEntry code (non-OO version) if (myKind == kind3 || myKind == kind4) { //.. } else if (myKind == fullhouse) { //.. } else if (myKind == smallstraight) { //.. } l This kind of coding doesn’t scale (and isn’t OO)  Adding a new kind requires recompiling.cpp  Add new enum requires changing.h too  Duplication in score() and getDescription()

CPS Inheritance and Yahtzee program l ScoreEntry is a “kitchen-sink” class  Changing the.h requires recompiling all files that include it, either directly or indirectly  Consequences of large-scale recompiling? What about building large programs (word, XP, etc.) l Changes made in several places in scoreentry.cpp as well  Code in different places, related, must be synchronized  Order of entries in enum makes a difference (hard to find bugs as a result) l Inheritance helps keep related code together, avoids recompilation, facilitates extension, keeps each class simple  Consequence: many classes rather than one

CPS Yahtzee with inheritance l Base class behavior: some default, some left to subclasses  If subclass can change behavior use virtual keyword  If subclass must implement, use = 0 aka abstract This is a pure virtual function class ScoreEntry { public: ScoreEntry(); virtual ~ScoreEntry(); virtual int calcScore(const DiceGroup& dg) const = 0; virtual string getDescription() const = 0; virtual int getScore() const; virtual void scoreIt(const DiceGroup& dg);

CPS Tradeoffs in per-class score entry l More classes: one per entry (above line entries are same)  Proliferation of classes, harder to understand/grok?  Test classes in isolation, facilitates code/test/deploy l In creating a new score-card entry, do we modify existing header files? Existing.cpp files? Benefits?  What must be recompiled when adding small straight to the ScoreCard class?  Somehow the ScoreCard class must have all entries.

CPS Guidelines for using inheritance l Create a base/super/parent class that specifies the behavior that will be implemented in subclasses  Most/All functions in base class may be virtual Often pure virtual (= 0 syntax), subclasses must implement  Subclasses do not need to specify virtual, but good idea May subclass further, show programmer what’s going on  Subclasses specify inheritance using : public Base C++ has other kinds of inheritance, stay away from these  Must have virtual destructor in base class l Inheritance models “is-a” relationship, a subclass is-a parent-class, can be used-as-a, is substitutable-for  Standard examples include animals and shapes

CPS Inheritance guidelines/examples l Virtual function binding is determined at run-time  Non-virtual function binding (which one is called) determined at compile time  Need compile-time, or late, or polymorphic binding  Small overhead for using virtual functions in terms of speed, design flexibility replaces need for speed Contrast Java, all functions “virtual” by default l In a base class, make all functions virtual  Allow design flexibility, if you need speed you’re wrong, or do it later l In C++, inheritance works only through pointer or reference  If a copy is made, all bets are off, need the “real” object

CPS Student behavior/interface?.h file class Student { public: Student(const string & name); virtual ~Student(); virtual void eat(); virtual void work(); virtual void sleep(); virtual void live(); bool isAlive() const; // more here

CPS Implementation of behavior,.cpp file void Student::sleep() { myEnergy += 10; cout << "Zzzzzzzzzzzzz, resting sleep" << endl; } void Student::live() { eat(); work(); sleep(); }

CPS See students.cpp, school.cpp l Base class student doesn’t have all functions virtual  What if subclass has different name() function? name() bound at compile time, no change observed How do subclass objects call parent class code, see DukeStudent class in school.cpp  class::function syntax, must know name of parent class l Why is base class data protected rather than private?  Must be accessed directly in subclasses, why?  Not ideal, try to avoid state in base/parent class: trouble What if derived class doesn’t need data?

CPS Inheritance Heuristics in C++ l Pure virtual (aka abstract) function makes a class abstract  Cannot be instantiated, but can be constructed (why?) What do subclasses do?  Default in C++ is non-virtual or monomorphic Unreasonable emphasis on efficiency, sacrifices generality If you think subclassing will occur, all methods are virtual  Must have virtual destructor, the base class destructor (and constructor) will be called l We use public inheritance, models is-a relationship  Private inheritance means is-implemented-in-terms-of Implementation technique, not design technique Not ubiquitous in other languages

CPS Difference in behavior? l What’s a field and what’s a method?  # tires on car?  # doors on car?  How student lives? l Where does name of school belong? What about energy increment? l What’s problem with hierarchy here?  NCState student? Student DukeStudent UNCStudent CosmicDukeStudent CosmicUNCStudent

CPS Problems with inheritance l Consider the student example and burrito eating  CosmicStudent is a subclass of DukeStudent What behavior changes in the new subclass?  What about a UNCStudent eating cosmic cantina food? Can we have CosmicDukeStudent and CosmicUNCStudent? Problems with this approach? l Alternative to inheritance: use delegation (aka layering, composition)  Just like myEnergy is a state variable with different values, make myEater a state variable with different values  Delegate behavior to another object rather than implementing it directly

CPS Delegation with school/student l If there's a class Eater, then what instance variable/field will a Student store to which eating behavior delegated? void Student::eat() { myEater->doEat(); }  How is the eater instance variable initialized?  Could we adopt this approach for studying too?  When is this approach better/worse?