1 Object Oriented Languages Objectives: – Introduction/Overview – Class Fundamentals classes / instances slots and methods – Inheritance interpretation.

Slides:



Advertisements
Similar presentations
OO Programming in Java Objectives for today: Overriding the toString() method Polymorphism & Dynamic Binding Interfaces Packages and Class Path.
Advertisements

Module 8 “Polymorphism and Inheritance”. Outline Understanding Inheritance Inheritance Diagrams Constructors in Derived Classes Type Compatibility Polymorphism.
Inheritance Inheritance Reserved word protected Reserved word super
ACM/JETT Workshop - August 4-5, :Inheritance and Interfaces.
1 Inheritance Reserved word protected Reserved word super Overriding methods Class Hierarchies Reading for this lecture: L&L 8.1 – 8.5.
INF 523Q Chapter 7: Inheritance. 2 Inheritance  Another fundamental object-oriented technique is called inheritance, which enhances software design and.
OOP in Java Nelson Padua-Perez Chau-Wen Tseng Department of Computer Science University of Maryland, College Park.
1 Chapter 6 Inheritance, Interfaces, and Abstract Classes.
Chapter 10 Inheritance, Polymorphism, and Scope. 2 Knowledge Goals Understand the hierarchical nature of classes in object-oriented programming Understand.
Aalborg Media Lab 23-Jun-15 Inheritance Lecture 10 Chapter 8.
OOP in Java Fawzi Emad Chau-Wen Tseng Department of Computer Science University of Maryland, College Park.
Unit 5 School of Information Systems & Technology1 School of Information Systems and Technology (IST)
VIRTUAL FUNCTIONS AND DYNAMIC POLYMORPHISM. *Polymorphism refers to the property by which objects belonging to different classes are able to respond to.
Programming Languages and Paradigms Object-Oriented Programming.
CSM-Java Programming-I Spring,2005 Introduction to Objects and Classes Lesson - 1.
“is a”  Define a new class DerivedClass which extends BaseClass class BaseClass { // class contents } class DerivedClass : BaseClass { // class.
OOPs Object oriented programming. Based on ADT principles  Representation of type and operations in a single unit  Available for other units to create.
Chapter 8 More Object Concepts
CSM-Java Programming-I Spring,2005 Objects and Classes Overview Lesson - 1.
Introduction to Object Oriented Programming. Object Oriented Programming Technique used to develop programs revolving around the real world entities In.
Inheritance and Class Hierarchies Ellen Walker CPSC 201 Data Structures Hiram College.
1 Abstraction  Identify important aspects and ignore the details  Permeates software development programming languages are abstractions built on hardware.
1 Chapter 10: Data Abstraction and Object Orientation Aaron Bloomfield CS 415 Fall 2005.
1 Object-Oriented Software Engineering CS Interfaces Interfaces are contracts Contracts between software groups Defines how software interacts with.
Programming in Java Unit 2. Class and variable declaration A class is best thought of as a template from which objects are created. You can create many.
Features of Object Oriented Programming Lec.4. ABSTRACTION AND ENCAPSULATION Computer programs can be very complex, perhaps the most complicated artifact.
CSE 501N Fall ‘09 14: Inheritance 20 October 2009 Nick Leidenfrost.
Inheritance and Polymorphism Daniel Liang, Introduction to Java Programming.
Inheritance - Polymorphism ITI 1121 Nour El Kadri.
More on Hierarchies 1. When an object of a subclass is instantiated, is memory allocated for only the data members of the subclass or also for the members.
Chapter 12 Support for Object oriented Programming.
8. Inheritance “Is-a” Relationship. Topics Creating Subclasses Overriding Methods Class Hierarchies Abstract Class Inheritance and GUIs The Timer Class.
Copyright © 2009 Pearson Education, Inc. Publishing as Pearson Addison-Wesley Java Software Solutions Foundations of Program Design Sixth Edition by Lewis.
Inheritance. Inheritance is a fundamental object-oriented design technique used to create and organize reusable classes Chapter 8 focuses on: deriving.
Lecture 10 Concepts of Programming Languages Arne Kutzner Hanyang University / Seoul Korea.
CS451 - Lecture 2 1 CS451 Lecture 2: Introduction to Object Orientation Yugi Lee STB #555 (816) * Acknowledgement:
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
Programming With Java ICS201 University Of Ha’il1 Chapter 7 Inheritance.
Object Oriented Programming
UMass Lowell Computer Science Java and Distributed Computing Prof. Karen Daniels Fall, 2000 Lecture 9 Java Fundamentals Objects/ClassesMethods Mon.
ISBN Object-Oriented Programming Chapter Chapter
Inheritance CSI 1101 Nour El Kadri. OOP  We have seen that object-oriented programming (OOP) helps organizing and maintaining large software systems.
Application development with Java Lecture 21. Inheritance Subclasses Overriding Object class.
1 Inheritance Reserved word protected Reserved word super Overriding methods Class Hierarchies Reading for this lecture: L&L 9.1 – 9.4.
COM S 228 Introduction to Data Structures Instructor: Ying Cai Department of Computer Science Iowa State University Office: Atanasoff.
Classes, Interfaces and Packages
Object orientation and Packaging in Java Object Orientation and Packaging Introduction: After completing this chapter, you will be able to identify.
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.
 Description of Inheritance  Base Class Object  Subclass, Subtype, and Substitutability  Forms of Inheritance  Modifiers and Inheritance  The Benefits.
C++ General Characteristics: - Mixed typing system - Constructors and destructors - Elaborate access controls to class entities.
COMPUTER SCIENCE & TECHNOLOGY DEGREE PROGRAMME FACULTY OF SCIENCE & TECHNOLOGY UNIVERSITY OF UVA WELLASSA ‏ Properties of Object Oriented Programming.
CSCE 240 – Intro to Software Engineering Lecture 3.
ISBN Chapter 12 Support for Object-Oriented Programming.
UMass Lowell Computer Science Java and Distributed Computing Prof. Karen Daniels Fall, 2000 Lecture 10 Java Fundamentals Objects/ClassesMethods.
Inheritance a subclass extends the functionality of a superclass a subclass inherits all the functionality of a superclass don't reinvent the wheel – "stand.
Inheritance Modern object-oriented (OO) programming languages provide 3 capabilities: encapsulation inheritance polymorphism which can improve the design,
Modern Programming Tools And Techniques-I
Inheritance ITI1121 Nour El Kadri.
Lecture 12 Inheritance.
Final and Abstract Classes
Inheritance and Polymorphism
Inheritance Modern object-oriented (OO) programming languages provide 3 capabilities: encapsulation inheritance polymorphism which can improve the design,
PRINCIPALES OF OBJECT ORIENTED PROGRAMMING
Virtual Functions Polymorphism is supported by C++ both at compile time and at run time. Compile-time polymorphism is achieved by overloading functions.
Java Inheritance.
Inheriting Multiple Base Classes
Lecture 10 Concepts of Programming Languages
Computer Science II for Majors
Presentation transcript:

1 Object Oriented Languages Objectives: – Introduction/Overview – Class Fundamentals classes / instances slots and methods – Inheritance interpretation of inheritance code sharing single inheritance multiple inheritance alternatives to multiple inheritance Ed Sykes

2 Introduction / Overview 2 main approaches to OO programming languages: – class-based – prototype-based

3 Introduction / Overview Class-based OO programming languages: A class is a template for the instantiation of objects: instance == object classes are static source code representations objects are dynamic entities which live during program execution. Objects are distinct entities.

4 Introduction / Overview Objects exhibit 3 main properties: – encapsulation – inheritance – polymorphism

5 Introduction / Overview Encapsulation – hiding how things are done within the object – this includes: information hiding method hiding

6 Introduction / Overview Encapsulation eg., ATM: properties: – name/address/phone/account_type – balance functionality: – withdraw() – deposit() – get_balance()

7 Introduction / Overview Inheritance – “is a kind of” relation

8 Introduction / Overview Polymorphism: – “many” “forms” – same general interface, different implementation: – 2 types of polymorphism: compile-time polymorphism run-time polymorphism (dynamic binding)

9 Introduction / Overview Polymorphism: – run-time polymorphism (dynamic binding) – closely related to inheritance – e.g., load_vehicle(), drive_vehicle()

10 Object Oriented Languages Objectives: – Introduction/Overview – Class Fundamentals classes / instances slots and methods – Inheritance interpretation of inheritance code sharing single inheritance multiple inheritance alternatives to multiple inheritance

11 Class Fundamentals Objectives: class/instance difference classes as abstract data types information hiding (encapsulation) internal structure of classes

12 Class Fundamentals Classes are central to OO programming languages mechanism for defining sets of objects + operations to manipulate them Term “class” can be interpreted as: 1)a set of objects 2)a program structure or module 3)a factor-like entity which creates objects 4)a data type

13 Class Fundamentals 1) “class” as a set of objects: A class defines properties or operations that are common to a collection of objects. Objects are manipulated by programs and exist at runtime only.

14 Class Fundamentals 2) “class” as a program structure or module: - modules encapsulate types, data (variables), and operations. - modules export some entities (operations) - modules hide their internal details - Objects are instances of modules data operationsOutside world

15 Class Fundamentals 3) “class” as a factory-like entity: - Emphasizes dynamic nature of OO languages - class is a device that can create objects - opens the way to describe objects in a parametric fashion  Dynamic unique way for instantiating objects data operations class creates object

16 Class Fundamentals 4) “class” as a data type: - classes in many OO languages are considered to be types - operations defined over that type are part of the types definition e.g., given a class ‘C’, and a variable v. v : C; // variable ‘v’ is of type ‘C’

17 Class Fundamentals Instances: - Can be bound, pointed to, and passed in and out of procedures  first-class citizens public class Customer{ private String _name; private String _phone;... public void setName(String Name) public String getName()... Bobby Boogie (905) Sue MacDonald (416) Class (definition) Instances (runtime entities)

18 Class Fundamentals Typically, the instance creation process allows arguments: e.g., constructors (default and overloaded): public Customer(){ System.out.println("In default constructor"); } public Customer(String name, String phone) { this(); _name = name; _phone = phone; } public Customer(String name, String phone, double discount){ this(name, phone); this._discount = discount; }

19 Class Fundamentals Slots and Methods: -2 types: -data slots -procedural slots (methods) class method slots

20 Class Fundamentals Slot access: -Data slots represent variable or constant information - 2 modes: -Read-only (e.g., constant) -Read-write mode (e.g., salary slot)

21 Class Fundamentals Slot visibility Externally visible slots class Slots visible only within class

22 Class Fundamentals Slot visibility: -C++ and Java: -public private protected -applies to data slots and method slots public : - can be referenced, accessed and updated anywhere in the program private: - is only visible within the class in which it is defined. protected: - can be referenced, accessed and updated within the class and within all of the subclasses

23 Class Fundamentals Slot visibility: -Slots may be allocated in 2 different ways: 1)the slot is allocated in each instance of the class (default) 2)the slot is allocated once and is shared by all instances of a class (class variables or static variables in C++, Smalltalk)

24 Class Fundamentals Example: public Customer(){ private static double minimum_labour = 55; // $55 per hour private String _name; private String _phone; public static void increment_labour_price(double increase){ minimum_labour += increase; // $60.50 now. } Invoke by using class name or instance: Customer.increment_labour_price(5.50);

25 Object Oriented Languages Objectives: – Introduction/Overview – Class Fundamentals classes / instances slots and methods – Inheritance interpretation of inheritance code sharing single inheritance multiple inheritance alternatives to multiple inheritance

26 Inheritance - The definition of a new class can rely upon the existence of another definition. - Core concept behind OO reusability - Supports run-time polymorphism 3 views of inheritance: 1) Inheritance is a method for code sharing 2) Logical relationship between classes (specialization/generalization) 3) Type-based account (enables subtypes to be produced given a definition of a supertype)

27 Inheritance subclass Definitions: superclass: both the immediate superclass and all ancestors of a given class subclass: converse of superclass direct subclass: Van is a direct subclass of Truck indirect subclass: Van is an indirect subclass of Vehicle superclass

28 Inheritance C1: superclass C2: subclass m11 m12 m13 s11 s12 m21 m22 s21 s22 s23

29 Inheritance Instantiated object of type C2 would appear like: m11 m12 s11 s12 s21 m13 m21 m22 s22 s23

30 Inheritance For single inheritance there is 1 root class from which subclasses are derived. e.g., an inheritance graph root C1 C2 C3D B EF

31 Inheritance From C3, a class sees only a linear sequence of classes between it and the root class e.g., an inheritance chain root C1 C2 C3

32 Inheritance example: Car extends Vehicle: in Car,  –inherited slots (instance variables) –methods from the Vehicle class (potentially overriden)

33 Inheritance public class Car extends Vehicle {... } public class Sports_Car extends Car {... } Each class inherits ALL variables, and methods from parent class.

34 Inheritance public class Vehicle { private String _vin; private String _make; private String _model; private int _year; private long _odometer; } public class Car extends Vehicle { private float _max_speed; private int _num_of_passengers; private int _horse_power; private float _engine_size; private String _air_cond; }

35 Inheritance super() used for calling parent class constructors 1st line in subclass constructor public Sports_Car() { super(); } public Sports_Car(String owner, String vin, String make, String model, int year, long odo) { super(owner,vin,make,model,year,odo); } What method is called here? what method is called here?

36 Inheritance super.method() Within a subclass' overriden method, invoke parent's method. public class Building {... public void drawBuilding() {... } // implementation for Building public void calcArea() {... } } public class House extends Building {... public void calcArea() { super.calcArea(); // invoke Building’s calcArea() method... }

37 Inheritance Adding specific methods to the subclass public class Building { private int _rooms; private int _floors; private int _area; public void setRooms(int num) {... } public int getRooms() {... } public void setFloors(int num) {... } } public class House extends Building { private int _bedrooms; private int _baths; public void setBedrooms(int num) {... } public int getBedrooms() {... } public void setBaths(int num) {... } }

38 Abstract Classes serves as a place holder in an inheritance graph defines those properties and behaviours required by many other classes Note: 1)no objects can be created of this class type. It is merely used as a foundation for subclasses. 2) But you can create references to this class. This is the principle way we achieve run-time polymorphism.

39 Abstract Classes public abstract class Convert { protected double _init;// initial value protected double _conv; // converted value public Convert(double i) { _init = i; } public double getconv() { return _conv; } public double getinit() { return _init; } public abstract void compute(); // abstract method Abstract Method: implementation stub part of an abstract class must be defined in a concrete subclass

40 Abstract Classes class l_to_g extends Convert { public l_to_g(double i) { super(i); } public void compute() { // definition of abstract method _conv = _init / ; } public String toString() { return (this.getinit() + " litres is " + this.getconv() “ gallons” ); }

41 Abstract Classes // Fahrenheit to Celsius class f_to_c extends Convert { public f_to_c(double i) { super(i); } public void compute() { // definition of abstract method _conv = (_init-32) / 1.8; } public String toString() { return (this.getinit() + " Celsius is " + this.getconv() ); }

42 Abstract Classes public static void main(String[] args) { Convert p;// pointer to base class l_to_g lgob = new l_to_g(5); // litres to gallons object p = lgob; p.compute(); System.out.println(p); f_to_c fcob = new f_to_c(82); p = fcob; p.compute(); System.out.println(p); } would Convert p = new Convert(); work? why?

43 Abstract Class Eg. in C++ class number { protected: int val: public: void setval(int i){val = i;} virtual void show() = 0;// declare show() to be a pure virtual function }; class hextype : public number{ public: void show() {cout << hex << val <<“\n”;} }; class dectype : public number{ public: void show() {cout << val <<“\n”;} }; class octtype : public number{ public: void show() {cout << oct << val <<“\n”;} }; main(){ dectype d; hextype h; octtype o; d.setval(20); d.show();// Output: 20 - decimal h.setval(20); h.show();// Output: 14 - hexidecimal o.setval(20); o.show();// Output: 24 - octal }

44 Inheritance as Subtyping One problem with inheritance is that it should be hidden from its subtypes (its clients) In other words: - the way in which a class is derived should not matter to users of that class. - The effects of inheritance can be felt when redefining subclasses

45 Inheritance as Subtyping -Subtyping: - consists of the rules by which objects of one type (class) are determined to be acceptable in contexts that expect another type (class) (e.g., downcasting) - is important since the rules determine the legality of programs - should be based on the behaviour of objects

46 Inheritance as Subtyping -Subtyping: - if instances of class X meet the external interface of class Y then X should be a subtype of Y. Y X

47 Inheritance as Subtyping -The concept of a type hierarchy can be represented by abstract classes (or interfaces) -behavioural subtyping cannot be deduced without formal semantic specification of behaviour. -without these rules, subtypes can only be deduced on the basis of external interfaces of a syntactic nature (e.g., method signatures)

48 Inheritance as Subtyping -The programmer should be able to specify that the class is not a subtype of a parent or that the class is a subtype of an unrelated class (i.e., not its parent) -The 1 st case comes about when the behaviour of the objects is incompatible with the interface of parent objects. -The 2 nd case arises when the class supports the external interface of another class without sharing its implementation

49 Multiple Inheritance - Natural extension of single inheritance - corresponds to the application domain in a natural fashion Inheritance structure is a lattice or Directed Acyclic Graph: B X C Y D F G A HE Searching is required since slots and methods may not be defined locally What are the paths from X to Y?

50 Multiple Inheritance - problems with multiple inheritance: -how to search the inheritance lattice? -replication of inherited slots (“common roots” problem) -meaning of the program can be different depending on search algorithm B X C Y D F G A HE

51 Approaches to Multiple Inheritance 3 approaches to finding a slot in a multiple inheritance lattice: -Tree Inheritance -Graph Inheritance -Linearized Inheritance Given the lattice structure: Y2 X Z Y1

52 Tree Inheritance - We can transform a lattice into a tree: Y2 X Z Y1 -involves labeling nodes when conflicts arise -thus, a class may inherit more than 1 copy of a slot (or method) but under different names  renaming algorithm is required  Each parent of each class will define a completely separate set of inherited slots Encapsulation is preserved: i.e., the way in which a class is derived should not be visible – only the immediate superclass should be visible to a class. …but there are problems…

53 Tree Inheritance - Problems: -Tree inheritance radically alters the semantics of inheritance: -e.g., Point x y move() BoundedPoint HistoryPoint Want to create a BoundedHistoryPoint…

54 Tree Inheritance - Problems: Point x y move() BoundedPoint x1 y1 move1() HistoryPoint x2 y2 move2() BoundedHistoryPoint x3 y3 x4 y4 move3() move4() In some examples, where exactly 1 instance of a property makes sense tree inheritance does not work  it leads to duplication

55 Graph Inheritance Method: Work with the lattice directly. Search the inheritance graph somehow and resolve conflicts in some way. Problem: graph inheritance exposes the inheritance structure (i.e., each class has knowledge about its set of ancestors): S2 B A S1 - If S1 defines those slots in A for itself, any side-effects are not seen in S2. - However, if S1 merely inherits slots from A, all side-effects will be seen in S2.  The structure of inheritance is exposed to subclasses  This violates the concept of encapsulation

56 Graph Inheritance Solution: - special-purpose methods are used to resolve conflicts - e.g., redefine the inherited operation in the child class - the child can invoke the operations defined by the parent and then perform any local computation (e.g., super in Java) S2 B A S1 f() redefined f() However, the inheritance structure is still exposed which leads to problems…

57 Graph Inheritance Problem: A programmer cannot change the use of inheritance within in a class without potentially breaking some descendent class. e.g., Y2 X Z Y1 f() If operation f() is defined only by class Z, it will be inherited by Y1 and Y2 and then by X. No problems f() However, suppose the programmer changes Y2 so that it no longer inherits from Z but supports the same behaviour  Class X will be in error: 2 different f() methods will be inherited (one from Z via Y1, the other from class Y2) Y2 X Z Y1 f() f’() 

58 Linearized Inheritance - method: 1) flatten the inheritance structure into a linear chain without duplicates 2) search the chain in order to find slots (similar to single inheritance) S2 B A S1 -The order in which the linearization algorithm encounters superclasses in important - Programmer can set the order -Suppose S1 and S2 define slot “x”: -One or the other will be selected; the other will be masked off by the inheritance algorithm Note: the choice between them is arbitrary unless more information is given. xx

59 Linearized Inheritance - problem: -Inherited classes are not guaranteed communication with their direct ancestors. -The linearization algorithm can insert unrelated classes between an inheriting class and one of its direct ancestors. S2 B A S1  B – S1 – S2 – A Consequence: B cannot communicate directly with S2, similarly, S1 cannot communicate with A

60 Linearized Inheritance - inheritance involves search for slots (and methods) - approach: -Linearize the graph then remove duplicates from one end or other of the resulting sequence -Recall: B X C YD F G A HE Implementation: Pre-order traversal: - visit each node and put each node into a list when we visit it - once we have collected all the nodes, we can remove all duplicates 2 ways to remove duplicates: - remove duplicates from the front - remove them from the end.

61 Linearized Inheritance - problems: 1) Linearization process inserts unrelated classes between related ones  programmer is totally unaware… iteration over ancestors can generate unexpected results. 2) Communication with the “real” parents is very hard to establish.

62 Implemented Multiple Inheritance Techniques - In C++ a new kind of superclass is used: virtual superclass  Compiler is instructed to use only 1 copy of the named superclass  Only 1 copy will appear in any of its subclasses C D A B

63 // This program will not compile #include “iostream.h” class base { public: int i; }; class derived1 : public base { public: int j; }; class derived2 : public base { public: int k; }; class derived3 : public derived1, public derived2 { // This causes two copies public: // of base in derived3 int sum; };

64 main() { derived3 ob; ob.i = 10;// Which i ? ob.j = 20; ob.k = 30; ob.sum = ob.i + ob.j + ob.k; // which i? cout << ob.i << “ “;// which i ? cout << ob.j << “ “ << ob.k << “ “; cout << ob.sum; }

65 Two ways to solve this problem: 1. Use the scope resolution operator. e.g., given ob of type derived3, ob.derived1::i = 10; 2. Using virtual base classes

66 // Virtual base classes #include “iostream.h” class base { public: int i; }; class derived1 : virtual public base {// derived1 inherits base as virtual public: int j; }; class derived2 : virtual public base {// derived2 inherits base as virtual public: int k; }; class derived3 : public derived1, public derived2 { // only one copy of the base class though public: int sum; }; main() { derived3 ob; ob.i = 10;// valid here now because there is only 1 copy of the base ob.j = 20; ob.k = 30; ob.sum = ob.i + ob.j + ob.k;// valid here cout << ob.i << “ “ << ob.k << “ “;// and here too cout << ob.sum; }

67 Alternatives to Multiple Inheritance - Interfaces in Java - Mixin classes

68 Interfaces Are: – fully abstract classes: – ALL methods are: abstract – ALL variables are: public static final A class implements 1 or more interfaces A class can extend only 1 class Java supports the principle of multiple inheritance by using interfaces.

69 Interfaces E.g., Drivable: cars, boats, train, etc., (any 2D travelable vehicle/craft) Flyable kite, plane, jet, etc. (any 3D travelable object (ufo?))

70 Interfaces public interface Drivable { int MAX_DEGREE = 45; void turnLeft(int deg); void turnRight(int deg); } public interface Flyable { int MAX_DEGREE = 80; void turnLeft(int deg); void turnRight(int deg); void turnUp(int deg); void turnDown(int deg); } recall: all methods are implicitly public abstract all variables are implicitly public static final

71 Interfaces public class Sailboat extends Boat implements Drivable { public void turnLeft(int deg) { // my definition of turnLeft } public void turnRight(int deg) { // my definition of turnRight }

72 Mixin Classes -Similar to abstract classes -Are useful and highly flexible building blocks to construct inheritance hierarchies -alternative approach to multiple inheritance

73 Mixin Classes class Point2D(xc: Int, yc: Int) { val x = xc; val y = yc; override def toString() = "x = " + x + ", y = " + y; } class ColouredPoint2D(u: Int, v: Int, c: String) extends Point2D(u,v){ var color = c; def setColour(newCol: String): Unit = colour = newCol; override def toString() = super.toString() + ", col = " + colour; } Our mixin class

74 Mixin Classes class Point3D(xc: Int, yc: Int, zc: Int) extends Point2D(xc, yc) { val z = zc; override def toString() = super.toString() + ", z = " + z; } class ColoredPoint3D(xc: Int, yc: Int, zc: Int, col: String) extends Point3D(xc, yc, zc) with ColoredPoint2D(xc, yc, col); Our mixin class Rule: A class can only be used as a mixin in the definition of another class, if this other class extends a subclass of the superclass of the mixin. Since ColoredPoint3D extends Point3D and Point3D extends Point2D (the superclass of ColoredPoint2D ), the code is well-formed.

75 Mixin Classes