170 likes | 270 Views
Multiple Inheritance. Class Structure : D irected A cyclic G raph. Examples in System Modeling. Multiple inheritance facilitates combination of (orthogonal) abstractions. Company plane Airplane ( Pilot’s perspective )
E N D
Multiple Inheritance Class Structure : Directed Acyclic Graph L13MI
Examples in System Modeling Multiple inheritance facilitates combination of (orthogonal) abstractions. • Company plane • Airplane (Pilot’s perspective) • (queries) passenger_count, altitude, position, speed, etc. • (commands) take_off, land, set_speed, etc. • Asset (Accountant’s perspective) • (features) purchase_price, resale_value, depreciate, etc. • Dining car • Train car (coach) • Restaurant • Watch calculator L13MI
Multiple inheritance facilitates representation of various roles of an object. • Sofa bed, Mobile home, ... • Knowledge Representation • Clinton is a father. • Clinton is the ex-President of USA. • Nixon was a Republican. • Nixon was a Quaker. • Dolphins are aquatic creatures. • Dolphins are mammals. L13MI
Examples from Software Systems • Window • (Hierarchical Structure) Tree • (features) listOfSubwindows, parentWindow, addWindow, removeWindow, etc. • (Graphical Object) Rectangle • (features) height, width, position, display, hide, etc. L13MI
Linked list (leftmost child right sibling) • Tree • List • (features) countChildren, leftMostChild, addChild, removeChild, etc. • Cell • (features) parent, nextSibling, etc. L13MI
Graphics Example classComposite_Figure extends Figure, LinkedList[Figure] { ... void display() { forEachDo { item.display(); }; } void translate() { … } ...} Illustrates: multiple inheritance, polymorphic data structure, dynamic binding, recursion, etc. L13MI
Design Pattern Describing composite structures using multiple inheritance with a container class as a parent • More Examples • Menus with Submenus • Compound Commands • Graphical Object Groups L13MI
Name Clashes and Feature Renaming • Eiffel bans intra-class overloading. • Name clashes resulting from multiple inheritance can be resolved in the child class using feature renaming mechanism. • Redeclaration/redefinition changes the feature, but keeps the name. Renaming changes the name, but keeps the feature. • Redeclaration is semantic; renaming is syntactic. • Renaming also enables class designers to give locally appropriate names to features. L13MI
Repeated Inheritance A B C • Class D is a descendant of class A in more than one way. E.g., • A = Driver (age, address, birthday(), etc.) • B = French_Driver • C = US_Driver • D = US_French_Driver • Share : age • Replicate : address D L13MI
Multiple Inheritance of Features • A class that inherits differentbut identically named features from different parents is invalid. • Feature renaming may be used to avoid name clash. • Note that this case excludes repeated inheritance. • An attribute coming from repeated ancestor is shared, by default. Feature renaming may be used to replicate it. • In C++, allthe fields of a repeated ancestor are either shared (virtual) or duplicated. L13MI
Transcontinental Drivers in Eiffel class French_US_Driver inherit French_Driver rename address as french_address, violations as french_violations, pay_fee as french_pay_fee end US_Driver rename address as us_address, violations as us_violations, pay_fee as us_pay_fee end feature . . . // shared: age, name, ... end; L13MI
Conflicting Redefinitions • What if a feature f inherited by class D from repeated ancestor A has been redefined in B and/or C? • Conflicts under sharing (two impl., one name) • Problem: Name Clash • Eiffel provides rename, redefine, and undefine to enable a programmer to disambiguate. L13MI
(cont’d) • Conflicts under replication (two impl., two names) • Problem: Ambiguity for Dynamic binding A a = new D(); a.f(); • Eiffel provides select to let the programmer pick the appropriate impl. to run for f() on a D via a A-entity. L13MI
Windows in Eiffel class Window feature display is … end; class Window_with_Border inherit Window feature display is … end; class Window_with_Menu inherit Window feature display is … end; class Window_with_Border_and_Menu inherit Window_with_Border Window_with_Menu feature display is {Window_with_Border} Precursor; {Window_with_Menu} Precursor; end; Problem: Indirectly invokes Window.display twice!! L13MI
(Cont’d) class Window_with_Border_and_Menu inherit Window rename id as window_id select window_id redefine display end Window_with_Border rename id as border_id redefine display end Window_with_Menu rename id as menu_id redefine display end feature display is {Window} Precursor; draw_border; draw_menu; end; end; L13MI