Skip to content

ClassDefinition_step3

RoiArthurB edited this page Jul 30, 2026 · 4 revisions

Inheritance

Declaring a Parent Class

Every class that does not declare an explicit parent extends the built-in root class object. Use parent: to declare inheritance:

class vehicle {
	string name <- "vehicle";
	float speed <- 0.0;
	float max_speed <- 120.0;
	float distance_km <- 0.0;
	
	float move() {
		distance_km <- distance_km + speed;
		return speed;
	}
	
	string summary() {
		return "[vehicle] " + name + "  speed=" + (speed with_precision 1);
	}
}

Child Class with parent:

A child class inherits all attributes and actions from its parent:

class car parent: vehicle {
	
	string name <- "car";                    // override parent default
	float fuel <- 50.0;                       // new attribute
	float consumption_per_km <- 0.08;         // new attribute
	
	// Override the parent's move() with custom logic
	float move() {
		if fuel <= 0.0 {
			speed <- 0.0;
			return 0.0;   // out of fuel — can't move
		}
		float d <- super.move();                       // parent handles distance
		fuel <- max(0.0, fuel - d * consumption_per_km);  // consume fuel
		return d;
	}
	
	// Override summary() to append fuel info
	string summary() {
		return super.summary() + "  fuel=" + (fuel with_precision 1) + "L";
	}
	
	action refuel(float capacity) {
		fuel <- capacity;
	}
}

Key Points

  • parent: ClassName makes the new class extend that class.
  • super.action(args) calls the parent's version of a typed action (one that returns a value).
  • invoke action(args) calls the parent's version of a void procedure (action with no return).
  • Redefining an action with the same signature overrides it (dynamic dispatch).

Second Child with Same Parent

Another child can extend the same parent with different behavior:

class bicycle parent: vehicle {
	
	string name <- "bicycle";
	float max_speed <- 30.0;                       // override parent max
	string rider <- "nobody";                       // new attribute
	
	// Does NOT override move() — the parent implementation is used as-is.
	// Only overrides summary().
	string summary() {
		return super.summary() + "  rider=" + rider;
	}
}

Multi-Level Inheritance

A child can extend another child, creating a hierarchy:

class sports_car parent: car {     // car extends vehicle — so sports_car extends both
	
	string name <- "sports_car";
	float max_speed <- 250.0;         // override car's max_speed
	bool turbo_active <- false;
	float boost_factor <- 1.5;
	
	// Override car's move() (which itself calls vehicle.move())
	float move() {
		if turbo_active {
			float normal_speed <- speed;
			speed <- min(speed * boost_factor, max_speed);
			float d <- super.move();   // car.move() checks fuel → calls vehicle.move()
			speed <- normal_speed;      // restore
			return d;
		}
		return super.move();
	}
	
	// Override car's summary() (calling super.summary() which already includes vehicle info)
	string summary() {
		return super.summary() + "  turbo=" + turbo_active;
	}
}

The call chain for sports_car.move() when turbo is active:

  1. sports_car.move() → calls super.move()
  2. car.move() → calls super.move()
  3. vehicle.move() → the base implementation that updates distance

Runtime Type Testing with is

The is operator tests whether an object is an instance of a class or any of its subclasses:

car c <- car();
sports_car sc <- sports_car();
bicycle b <- bicycle();

c  is car;         // true
c  is vehicle;     // true (parent)
sc is sports_car;  // true
sc is car;         // true (sc extends car, which extends vehicle)
sc is vehicle;     // true (transitive)
b  is car;         // false (sibling — both extend vehicle but are unrelated)

Polymorphic Lists

An object typed as the parent class can hold any subtype object:

list<vehicle> fleet <- [c, b, sc];

loop v over: fleet {
	v.move();            // dispatches to the actual object's overridden move()
	v.accelerate(20.0);  // shared inherited action — same for all
	write v.summary();   // dispatches to each class's overridden summary()
}

Selecting Objects by Type

Use the select keyword with is to filter:

list<vehicle> fleet <- [c, b, sc];

// Get only cars (and subclasses like sports_car)
list<vehicle> only_cars <- fleet select (each is car);
write only_cars collect each.name;   // ["sedan", "gt500"]

Example: Full Model

class vehicle {
	string name <- "vehicle";
	float speed <- 0.0;
	float max_speed <- 120.0;
	float distance_km <- 0.0;
	
	float move() {
		distance_km <- distance_km + speed;
		return speed;
	}
	
	string summary() {
		return "[vehicle] " + name + "  speed=" + (speed with_precision 1);
	}
}

class car parent: vehicle {
	string name <- "car";
	float fuel <- 50.0;
	float consumption_per_km <- 0.08;
	
	float move() {
		if fuel <= 0.0 {
			speed <- 0.0;
			return 0.0;
		}
		float d <- super.move();
		fuel <- max(0.0, fuel - d * consumption_per_km);
		return d;
	}
	
	string summary() {
		return super.summary() + "  fuel=" + (fuel with_precision 1);
	}
}

global {
	init {
		car c <- car(name: "sedan", speed: 80.0, fuel: 40.0, max_speed: 180.0);
		bicycle b <- bicycle(name: "city-bike", speed: 15.0, rider: "Alice");
		
		// Polymorphic dispatch
		list<vehicle> fleet <- [c, b];
		
		loop times: 5 {
			loop v over: fleet {
				v.move();
			}
		}
		loop v over: fleet {
			write v.summary();   // calls overridden summary per type
		}
		
		// Type filtering
		list<vehicle> cars <- fleet select (each is car);
		write "Cars: " + cars collect each.name;
	}
}

experiment Inheritance title: "Inheritance" type: gui {}

Key Takeaways

Feature Syntax
Inherit from a class class Child parent: Parent {
Override an attribute Redefine it in the child with a new default value
Override a typed action Redefine with the same return type and parameters
Call parent action super.method() returns the parent's return value
Test object type obj is ClassName returns true for the class or any subclass
Polymorphic list list<Parent> items <- [child1, child2];
  1. What's new (Changelog)
  2. Migration Guide (2025-06 → 2026-06)
  1. Installation and Launching
    1. Installation
    2. Launching GAMA
    3. Updating GAMA
    4. Installing Plugins
  2. Workspace, Projects and Models
    1. Navigating in the Workspace
    2. Changing Workspace
    3. Importing Models
  3. Editing Models
    1. GAML Editor (Generalities)
    2. GAML Editor Tools
    3. Validation of Models
  4. Running Experiments
    1. Launching Experiments
    2. Experiments User interface
    3. Controls of experiments
    4. Parameters view
    5. Inspectors and monitors
    6. Displays
    7. Batch Specific UI
    8. Errors View
  5. Running Headless
    1. Getting Started
    2. Headless Legacy
    3. Headless Batch
  6. Preferences
  7. Troubleshooting
  1. Introduction
    1. Start with GAML
    2. Organization of a Model
    3. Basic programming concepts in GAML
  2. Manipulate basic Species
  3. Global Species
    1. Regular Species
    2. Defining Actions and Behaviors
    3. Interaction between Agents
    4. Attaching Skills
    5. Inheritance
  4. Defining Advanced Species
    1. Grid Species
    2. Graph Species
    3. Mirror Species
    4. Multi-Level Architecture
  5. Defining GUI Experiment
    1. Defining Parameters
    2. Defining Displays Generalities
    3. Defining 3D Displays
    4. Defining Charts
    5. Defining Monitors and Inspectors
    6. Defining Export files
    7. Defining User Interaction
  6. Classes and Objects
    1. Class Definition and Instantiation
    2. Attributes and Actions
    3. Inheritance
    4. Virtual Classes
    5. Advanced Features
  7. Exploring Models
    1. Run Several Simulations
    2. Batch Experiments
    3. Exploration Methods
  8. Optimizing Models
    1. Runtime Concepts
    2. Analyzing code performance
    3. Optimizing Models
  9. Multi-Paradigm Modeling
    1. Control Architecture
    2. Defining Differential Equations
  1. Manipulate OSM Data
  2. Cleaning OSM Data
  3. Diffusion
  4. Using Database
  5. Using Dataframes
  6. Using FIPA ACL
  7. Using BDI with BEN
  8. Using Driving Skill
  9. Manipulate dates
  10. Manipulate lights
  11. Using comodel
  12. Save and restore Simulations
  13. Using network
  14. Writing Unit Tests
  15. Ensure model's reproducibility
  16. Going further with extensions
    1. Calling R
    2. Using Graphical Editor
    3. Using Git from GAMA
  1. Built-in Species
  2. Built-in Skills
  3. Built-in Architecture
  4. Statements
  5. Data Type
  6. File Type
  7. Stats Extension
  8. Sound Extension
  9. BDI Extension
  10. FIPA Skill
  11. Expressions
    1. Literals
    2. Units and Constants
    3. Pseudo Variables
    4. Variables And Attributes
    5. Operators (Definition)
    6. Operators [A-A]
    7. Operators [B-C]
    8. Operators [D-H]
    9. Operators [I-M]
    10. Operators [N-R]
    11. Operators [S-Z]
  12. Exhaustive list of GAMA Keywords
  1. Installing the development version
    1. Install GAMA source code with Eclipse plugin
  2. Developing Extensions
    1. Developing Plugins
    2. Developing Skills
    3. Developing Statements
    4. Developing Operators
    5. Developing Types
    6. Developing Species
    7. Developing Control Architectures
    8. Index of annotations
  3. Introduction to GAMA Java API
    1. Architecture of GAMA
    2. IScope
  4. Using GAMA flags
  5. Creating a release of GAMA
  6. Documentation generation

  1. Predator Prey
  2. Road Traffic
  3. Incremental Model
  4. Luneray's flu
  5. BDI Agents
  6. Forager RL
  7. SIR Analysis
  8. 3D Model

  1. Team
  2. Projects using GAMA
  3. Scientific References
  4. Training Sessions

Resources

  1. Videos
  2. Conferences
  3. Pedagogical materials

Clone this wiki locally