ΤΟ ODMG ΚΑΙ ΟΙ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΠΟΥ ΠΡΟΤΕΙΝΕΙ. Γλώσσα Ορισμού Αντικειμένων (Object Definition Language - ODL)

Σχετικά έγγραφα
Αντικειµενοστρεφείς Βάσεις εδοµένων. Περιεχόµενα

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #12

Wrapper Classes, Abstract Classes and Interfaces

Εισαγωγή στον Αντικειμενοστρέφή Προγραμματισμό Διάλεξη #13

Προγραμματισμός Υπολογιστών με C++

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

Προγραμματισμός Υπολογιστών με C++

Αντικειµενοστρεφής Προγραµµατισµός

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

Προγραμματισμός Υπολογιστών με C++

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

class Movie extend Movies key title {attribute string title; attribute string review; relationship set <Actor> stars inverse Actor::acts_in;}

Διάλεξη 16-17: Πολυμορφισμός (Polymorphism) Διδάσκων: Παναγιώτης Ανδρέου

ΠΟΛΥΜΟΡΦΙΣΜΟΣ. 4.1 Κληρονομικότητα και Αρχή της Υποκατάστασης

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΕΙΣ ΒΑΣΕΙΣ Ε ΟΜΕΝΩΝ

Αντικειμενοστρεφής Προγραμματισμός

Δομές Δεδομένων & Αλγόριθμοι

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Προγραμματισμός Υπολογιστών με C++

Αντικειμενοστρέφεια. Henri Matisse, Harmony in Red, Κωστής Σαγώνας Νίκος Παπασπύρου

Παύλος Εφραιµίδης. Java. Κληρονοµικότητα

Πανεπιστήμιο Κρήτης Τμήμα Επιστήμης Υπολογιστών ΗΥ-562 Προχωρημένα Θέματα Βάσεων Δεδομένων Βασίλης Χριστοφίδης

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

public void printstatement() { System.out.println("Employee: " + name + " with salary: " + salary);

Βασικές Έννοιες Δοµών Δεδοµένων

Δομημένος Προγραμματισμός. Τμήμα Επιχειρηματικού Σχεδιασμού και Πληροφοριακών Συστημάτων

(Διαφάνειες Νίκου Βιδάκη)

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Προγραμματισμός Ι. Πίνακες, Δείκτες, Αναφορές και Δυναμική Μνήμη. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

ΚΛΗΡΟΝΟΜΙΚΟΤΗΤΑ ΚΑΙ ΠΟΛΥΜΟΡΦΙΣΜΟΣ

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Από τη UML στον Κώδικα. Μέρος Β

Γλώσσες προγραµµατισµού. Ανάπτυξη Συστηµάτων Λογισµικού

12. ΑΛΦΑΡΙΘΜΗΤΙΚΑ. υο είδη αλφαριθµητικών Τα αλφαριθµητικά της C πίνακες τύπου char Ta αντικείµενα της κλάσης string

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

Διδάσκων: Παναγιώτης Ανδρέου

Δυναμική μνήμη με πίνακες και λίστες

Δομημένος Προγραμματισμός (ΤΛ1006)

Σχεδίαση-Ανάπτυξη Εφαρμογών Πληροφορικής - Εβδομάδα 1

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

Αποθηκευμένες Διαδικασίες Stored Routines (Procedures & Functions)

Ανοικτά Ακαδημαϊκά Μαθήματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Οντοκεντρικός Προγραμματισμός

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

Ακεραιότητα και Ασφάλεια Μέρος 1 Σχεδιασμός Βάσεων Δεδομένων

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 5: Component Adaptation Environment (COPE)

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Οντοκεντρικός Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

Δείκτες σε συναρτήσεις. Προγραμματισμός II 1

API: Applications Programming Interface

οµές (structures) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα: Πίνακες δοµών, δείκτες σε δοµές, και αυτοαναφορικές δοµές.

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

17TimeThis.h function returns reference pointer to same object { return *this; }

Δομημένος Προγραμματισμός (ΤΛ1006)

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

TMA4115 Matematikk 3

Διδάσκων: Παναγιώτης Ανδρέου

Κλάσεις και αντικείμενα #include <iostream.h<

Στοίβες - Ουρές. Στοίβα (stack) Γιάννης Θεοδωρίδης, Νίκος Πελέκης, Άγγελος Πικράκης Τµήµα Πληροφορικής

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Hancock. Ζωγραφάκης Ιωάννης Εξαρχάκος Νικόλαος. ΕΠΛ 428 Προγραμματισμός Συστημάτων

Προγραμματισμό για ΗΜΥ

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

02 Αντικειμενοστρεφής Προγραμματισμός

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

Ηλεκτρονικοί Υπολογιστές

Προγραμματισμός Υπολογιστών με C++

Διάλεξη 11: Αντικειμενοστρεφής Σχεδιασμός ΙII

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ. Θεόδωρος Γ. Λάντζος Διάλεξη Νο1

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

Ζητήματα Σχεδίασης Λογισμικού Πελάτη

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

Διδάσκων: Παναγιώτης Ανδρέου

Δομές Δεδομένων & Αλγόριθμοι

Database System Concepts and Architecture (Αρχιτεκτονική, οµές, και Μοντέλα)

ΕΡΓΑΣΙΑ 4 - Αντικειμενοστραφής Υλοποίηση του Συστήματος Κατανομής Θέσεων σε Προγράμματα Σπουδών

Διδάσκων: Παναγιώτης Ανδρέου

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Προγραμματισμός Η/Υ (ΤΛ2007 )

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Ανάλυση Πληροφοριακών Συστημάτων. «Βασικές Έννοιες Αντικειμενοστρεφούς Προγραμματισμού Διαγράμματα κλάσεων» Βασίλειος Καρακόιδας

Transcript:

ΤΟ ODMG ΚΑΙ ΟΙ ΓΛΩΣΣΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ ΠΟΥ ΠΡΟΤΕΙΝΕΙ Γλώσσα Ορισμού Αντικειμένων (Object Definition Language - ODL) H ODL είναι μια γλώσσα που χρησιμοποιείται για να δηλώσει διαπροσωπείες (interfaces) σε τύπους αντικειμένων που ακολουθούν το μοντέλο αντικειμένων του ODMG-93 και έχει σκοπό να παρέχει μεταφερσιμότητα των σχημάτων των βάσεων δεδομένων. Κάποιες από τις αρχές σχεδίασης της ODL είναι οι εξής: Η ODL πρέπει να υποστηρίζει όλες τις σημασιολογικές δομές του ODMG μοντέλου αντικειμένων. Η ODL δε χρειάζεται να είναι μια πλήρης προγραμματιστική γλώσσα, αλλά μια γλώσσα προσδιορισμού διαπροσωπειών υπογραφών (interface signatures). Η ODL θα πρέπει να είναι ανεξάρτητη από προγραμματιστικές γλώσσες. Η ODL θα πρέπει να είναι συμβατή με την Interface Definition Language του OMG. Η ODL θα πρέπει να είναι επεκτάσιμη. Η ODL θα πρέπει να είναι πρακτική

Ακολουθεί το παράδειγμα ενός υποτυπώδους σχήματος σε ODL (με έντονα γράμματα φαίνονται οι δεσμευμένες λέξεις της ODL) interface Person ( extent people) attribute String name; attribute Struct Address Unsigned Short number, String Street, String city_name address; relationship Person spouse inverse Person::spouse; relationship Set<Person> children inverse Person::parents order by birth_date relationship List<Person> parents inverse Person::children; void birth (in String name); Boolean marriage (in String person_name) raises (no_such_person); Unsigned Short ancestors (out Set<Person> all_ancestors)raises (no_such_person); void move (in String new_address); ; interface Employee: Person ( extent employees key(name, id)) attribute Short id; attribute Unsigned Short annual_salary; ; interface City ( extent cities key city_code) attribute Unsigned Short city_code; attribute String name; attribute Set<Person> population; ;

Object Query Language - OQL Η OQL βασίζεται στο μοντέλο αντικειμένων του ODMG. Η OQL (στην τελευταία της έκδοση) είναι πολύ κοντά στην SQL 92. Οι επεκτάσεις που της δίνει είναι οι ιδέες του αντικειμενοστρεφούς μοντέλου (όπως σύνθετα αντικείμενα, ταυτότητα αντικειμένου, εκφράσεις μονοπατιών, πολυμορφισμός, κλήση μεθόδων, late binding). Η OQL παρέχει την ευκολία της άμεσης διαχείρισης για συλλογές αντικειμένων. Η OQL είναι μια γλώσσα όπου οι τελεστές μπορούν να συνδυαστούν ελεύθερα, αρκεί τα τελούμενα να σέβονται το σύστημα τύπων. Με τον τρόπο αυτό, το αποτέλεσμα της ερώτησης είναι ένα αντικείμενο που έχει τύπο που ανήκει στην ιεραρχία του ODMG και ως εκ τούτου μπορεί να ερωτηθεί ξανά. Η OQL δεν είναι από μόνη της υπολογιστικά πλήρης. Δεδομένου ότι οι OMLs και η OQL βασίζονται στο ίδιο σύστημα τύπων μπορεί κάποιος μέσα στις ερωτήσεις να καλεί μεθόδους (και αντίστροφα οι μέθοδοι να περικλείουν ερωτήσεις στην υλοποίησή τους). Η OQL δεν παρέχει τελεστές για αλλαγές (updates) αλλά βασίζεται στις μεθόδους των αντικειμένων, που έχουν καθοριστεί γι' αυτό το σκοπό. Η OQL παρέχει δηλωτικό τρόπο προγραμματισμού και έτσι μπορεί να βελτιστοποιείται εύκολα. Η OQL έχει εύκολα καθορίσιμα σημασιολογικά στοιχεία (semantics).

//Schema definition in C++ ODL class City; struct Address int number; String street; Ref<City> city; Address(); Address(int, const char*, const Ref<City> &); ; class Person: public Persistent_Object public: //Attributes String name; Address address; //Relationships Ref<Person> spouse inverse spouse; List<Ref<Person>> children inverse parents; List<Ref<Person>> parents inverse children; //Operations Person(const char* pname); void birth(const Ref<Person> &child); void marriage(const Ref<Person> &with); Ref<Set<Ref<Persons>>> ancestors() const; void move(const Address &) //move to a new address //Extension static Ref<Set<Ref<Person>>> people static const char * const extent_name; ; class Employee : public Person public: //Attributes int id; int annual_salary; //Operations Employee(int, int); //Extension static Ref<Set<Ref<Employee>>> employees; static const char * const extent_name; ;

class City : public Persistent_Object public: //Attributes int city_code; String name; Ref<Set<Ref<Perosn>>> population; //Operations City(int, const char*); //Extension static Ref<Set<Ref<City>>> cities; static const char * const; ; Aς υποθέσουμε ότι ο C++ ODL preprocessor παρήγαγε ένα αρχείο με όνομα "schema.hxx", που περιέχει τον ορισμό του παραπάνω σχήματος με standard C++ ορισμούς, ισοδύναμους με αυτούς για τις κλάσεις της C++ ODL. Ακολουθεί ο κώδικας υλοποίησης των μεθόδων σε C++ OML. //Classes implementation in C++ #include "schema.hxx" //Address struct Address::Address(int pno, const char* pstr, const Ref<City> &pcity) : number(pno),street (pstr), city(pcity) Address::Address(): number(0),street(0), city(0) //Class Person const char * const Person::extent_name = "people"; Person::Person(const char * pname): name(pname) people->insert_element(this); void Person::birth(const Ref<Person> &child) children.insert_element_last(child); if (spouse!= 0) spouse->children.insert_element_last(child);

void Person::marriage(const Ref<Person> &with) spouse = with; Ref<Set<Ref<Person>>> Person::ancestors() Ref<Set<Ref<Person>>> the_ancestors = new Set<Ref<Person>>; int i; for (i=0; i< 2; i++) if (parents[i]!= 0) the_ancestors->insert_element(parents[i]); Ref<Set<Ref<Person>>> grand_parents = parents[i]- >ancestors(); the_ancestors->union_with(*grand_parents); grand_parents.delete_object(); return the_ancestors; void Person::move(const Address &new_addr) if (address.city!= 0) address.city->population->remove_element(this); new_addr.city->population->insert_element(this); address = new_addr; mark_modified(); //necessary when an attribute changes //Class Employee const char* const Employee::extent_name = "employees"; Employee::Employee(const char *pname, int eid, int esalary): Person(pname),id(eid), salary(esalary) employees->insert_element(this);

//Class City const char * const City::extent_name = "cities" ; City::City(int code, const char* cname) : city_code(code), name(cname) cities->insert_element(this); Mε βάση και τις παραπάνω δηλώσεις των μεθόδων, μπορεί κανείς να αναπτύξει μια εφαρμογή σε C++ OML. #include <iostream.h> #include "schema.hxx" static Database dbobj; static Datadase * database = &dbobj; void Load() Transaction load; load begin; //Create extensions Person::people = new(database) Set<Ref<Person>>; Employee::employees = new(database) Set<Ref<Employee>>; City::cities = new(database) Set<Ref<City>>; database->set_object_name(person::people, Person::extent_name); database->set_object_name(employee::employees, Employee::extent_name); database->set_object_name(city::cities, City::extent_name); //3 Persons Ref<Person> God, Adam, Eve; God = new(database) Person("God"); Adam = new(database) Person("Adam"); Eve = new(database) Person("Eve"); //1 employee

Ref<Employee> Snake; Snake = new(database) Employee("Snake", 0, 0); //1 Address Address Paradise(7, "Apple", new(database) City(0, "Garden)); Adam move(paradise); Eve->move(Paradise); God->birth(Adam); Adam->marriage(Eve); load.commit; static void print_persons(const Collection<Ref<Person>> &s) Ref<Person> p; iterator<ref<person>> it = s.create_iterator(); while (it.next(p)) cout << p->name << "lives in" << p->address.city->name; void Show() Transaction show; show.begin(); Person::people = database->lookup_object(person::extent_name); City::cities = database->lookup_object(city::extent_name); Employee::employees = database->lookup_object(employee::extent_name); print_persons(*person::people); show.commit(); main() database->open("family"); Load(); Show(); database->close();

Smalltalk Binding ODL Declarations ODL Compiler Meta Objects Class O bjects Object Instances Language Binding Object Instances D atabase Im age Object subclass: #Address instancevariablenames: 'number street city ' classvariablenames: '' pooldictionaries: '' category: 'ODMG-Examples' "attributes" number "return the number" ^number number: anumber "set the number" ^number := anumber street "return the street" ^street street: astreet "set the street" ^street := astreet city

"return the city" ^city city: acity "set the city" ^city := acity Object subclass: #Person instancevariablenames: 'name address spouse children parents ' classvariablenames: 'People' pooldictionaries: '' category: 'ODMG-Examples' "attributes" name "return the id" ^name name: aname "set the name" ^name := aname address "return the address" ^address address: anaddress "set the address" ^address := anaddress "inverses" spouse "return the spouse" ^spouse formspouse: aperson "create a new couple" aperson becomespouse: self. self becomespouse: aperson.

dropspouse: aperson "drop the spouse relationship" aperson becomespouse: nil. self becomespouse:nil. children "return the children" ^children ifnil: [children := Set new] parents "return the Parents" ^parents ifnil: [parents := List new] formkin: aperson "aperson becomes the child of the receiver" aperson becomechild: self. self becomeparent: aperson. dropkin: aperson "aperson is no longer the child of a receiver" aperson removeparent: self. self removechild: aperson. "administer inverses" becomespouse: aperson "become the spouse of aperson" ^spouse := aperson becomeparent: aperson "become the parent of aperson" ^self children add: aperson becomechild: aperson "become the child of aperson" ^self parents add: aperson removeparent: aperson "remove aperson from the receiver's parents" ^self parents remove: aperson removechild: aperson

"remove aperson from the receiver's children" ^self children remove: aperson "other methods" birth: ababy "a couple has a baby" x self formkin: ababy. x := self spouse. x isnil iffalse: [x formkin: ababy]. marriage: aperson "marry somebody" self formspouse: aperson move: anaddress "move to a new address" oldcity newcity oldcity := self address city. oldcity isnil iffalse: [oldcity removepopulation: self]. newcity := anaddress city. newcity isnil iffalse: [newcity addpopulation: self]. self address: anaddress. ancestors "find the ancestors of the receiver" grandparents theancestors grandparents := Set new. theancestors := Set new. theancestors union: (self parents). self parents do: [:each each parents do: [:each1 grandparents add: each1] ]. ^theancestors union: grandparents

Object subclass: #City instancevariablenames: 'citycode name population' classvariablenames: 'Cities' pooldictionaries: '' category: 'ODMG-Examples' "attributes" citycode "return the citycode" ^citycode citycode: acitycode "set the citycode" ^citycode := acitycode name "return the name" ^name name: aname "set the name" ^name := aname population "return the population" ^population ifnil: [population := Set new] "administrate the set" addpopulation: aperson "add a Person to the population of the City" ^self population add: aperson removepopulation: aperson "remove a Person to the population of the City" ^self population remove: aperson

Person subclass: #Employee instancevariablenames: 'id annualsalary ' classvariablenames: 'Employees' pooldictionaries: '' category: 'ODMG-Examples' "attributes" id "return the id" ^id id: anid "set the id" ^id := anid annualsalary "return the annualsalary" ^annualsalary annualsalary: anannualsalary "set the annualsalary" ^annualsalary := anannualsalary