Metaklasser i Smalltalk.



Relaterede dokumenter
Introduktion til Smalltalk.

Objekt-orienteret programmering uden klasser: Self.

4 Basal Objekt-orienteret Programmering I.

Klasser og Objekter i Python. Uge 46 Learning Python: kap 15-16,

12 Metaobjekt protokoller i CLOS.

Abstrakte datatyper C#-version

18 Multivejstræer og B-træer.

Klasser og objekter. (Afsnit i manualen)

Videregående Programmering for Diplom-E Noter

30 Objekt-orienteret Programmering i Andre Sprog.

Forelæsning Uge 4 Torsdag

Udvidelse og specialisering. Klassehierarkier. Nedarvningsterminologi. Interfaces. Statiske og dynamiske typer. Polymorfi. Abstrakte klasser.

Klasser og Objekter i Python. Uge 11

Forelæsning Uge 2 Torsdag

DM507 Algoritmer og datastrukturer

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

DM507 Algoritmer og datastrukturer

Forelæsning Uge 2 Torsdag

29 Opsamling af Objekt-orienteret Programmering.

2 Funktionsorienteret programmering i Scheme.

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse Styring af layout.. 5. Zoom funktioner..

Rename og redefine. Abstrakte klasser. Dynamisk binding.

Miniprojekt i Programmering (MIP) for DAT2 og SW2, Forår 2012

5 Basal Objekt-orienteret Programmering II.

DM507 Algoritmer og datastrukturer

Skriftlig eksamen i Datalogi

Forelæsning Uge 2 Torsdag

10 Metodekombination og multimetoder i CLOS.

19 Hashtabeller. Noter. PS1 -- Hashtabeller. Hashing problemet. Hashfunktioner. Kollision. Søgning og indsættelse.

9 Introduktion til CLOS.

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

DM507 Algoritmer og datastrukturer

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Ugeseddel 4 1. marts - 8. marts

Videregående programmering i Java

Civilingeniøreksamen januar Skriftelig prøve den 12. januar 2001 Kursusnummer 49104

Software Construction 1 semester (SWC) Spørgsmål 1

Kursus navn: Indledende programmering Kursus nr

DATALOGI 1E. Skriftlig eksamen torsdag den 3. juni 2004

METODER ARV KLASSER. Grundlæggende programmering Lektion 5

DM507 Algoritmer og datastrukturer

Forelæsning Uge 2 Mandag

ISO 27001/27002:2013 i SecureAware Policy TNG

Objektorientering. Programkvalitet

2 Abstrakte datatyper.

Om binære søgetræer i Java

Aftenskole i programmering sæson Core Data del 2. Sæson 2-13

DM507 Algoritmer og datastrukturer

Prepress Serigrafi Grafisk Tekniker Grundforløb. Opgave 3: T shirt i flere farver

Design by Contract. Design and Programming by Contract. Oversigt. Prædikater

HVORDAN KAN REFERENCEARKITEKTUR IMPLEMENTERES I EN STANDARDISERET DOKUMENTATION?

Nyhedsmodul brugermanual

i x-aksens retning, så fås ). Forskriften for g fås altså ved i forskriften for f at udskifte alle forekomster af x med x x 0

Forelæsning Uge 4 Torsdag

DM507 Algoritmer og datastrukturer

Øvelse 10. Tobias Markeprand. 11. november 2008

Lær Python - Dag 4, modul 2 Objektorienteret programmering

Leif Smidt GODT IGANG MED IPAD - IOS 9

Data load og udtræk. 2. iteration: implmentation (test af backend) PHP mysql. Loade og parse XML (SimpleXML, Xpath) Filhåndtering i PHP JSON

DM507 Algoritmer og datastrukturer

Skriftlig eksamen i Datalogi

Newtons afkølingslov

dcomnet-nr. 6 Talrepræsentation Computere og Netværk (dcomnet)

Flettebreve og Doc2mail

DANMARKS TEKNISKE UNIVERSITET

Forelæsning Uge 12 Torsdag

Pædagogiske læreplaner

Målet for disse slides er at diskutere nogle metoder til at gemme og hente data effektivt.

DM507 Algoritmer og datastrukturer

Forelæsning Uge 2 Torsdag

Uniq.Survey-Xact.DK. Vejledning. Rambøll Management Olof Palmes Allé 20 DK-8200 Århus N Denmark. Tlf:

SWC Elementer i klassedefinition

Singleton pattern i C#

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

3.0 Velkommen til manualen for kanalen Shift Introduktion til kanalen Hvad er et spot? Opret et nyt spot 2

Håndtering af stof- og drikketrang

Virkefeltsregler i Java

26 Programbeviser I. Noter. PS1 -- Programbeviser I. Bevis kontra 'check af assertions' i Eiffel. Betingelser og bevisregler.

Dannelse af PDF-dokumenter

IT Support Guide. Installation af netværksprinter (direkte IP print)

DPSD undervisning. Vejledning til rapport og plan opsætning

Den automatiske sanseforventningsproces

Velkommen til ABC Analyzer! Grundkursusmanual 2 vil introducere dig til ABC Analyzers mere avancerede funktioner, bl.a.:

Forelæsning Uge 2 Mandag

Objects First with Java A Practical Introduction Using BlueJ

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

Lectio. Overgang til Lectio Eksamensmodul. MaCom A/S Vesterbrogade 48, København V Telefon:

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Forelæsning Uge 2 Mandag

Indholdsfortegnelse. 10 Brugergrupper med differentierede rettigheder Forbedret teksteditor Nye features i Epos e-rekruttering ver. 1.

Skrevet af stud. geom. Martin Hedegaard, Aalborg Universitet, virksomhedspraktikant

Mit Sygefravær. Introduktion til den borgervendte selvbetjeningsløsning. Marts Version 1.3

RefWorks Workshop Medicinsk Bibliotek Aalborg Universitetshospital. Oprettelse af konto/log in RefWorks-databasen... 2

DANSK LYS: Lys i byens rum Lyspunkter Light Spots

KAPITEL 8: OPRETTELSE OG ADMINISTRATION AF DOKUMENTGODKENDELSE

Målet for disse slides er at beskrive nogle algoritmer og datastrukturer relateret til at gemme og hente data effektivt.

Forelæsning Uge 1 Torsdag

Overordnet set kan man inddele matematikholdige tekster i to kategorier tekster i matematiksammenhænge og tekster i andre sammenhænge.

Transkript:

8 Metaklasser i Smalltalk. Motivation Metodeopslag Simple metaklasser Mere udviklede metaklasser Klasse- og metaklassehierarkiet Instantiering og initialisering Skabelse af klasser og metoder Oversigt over generelle klasser Automatisk skabelse af access metoder Kurt Nørmark, Aalborg Universitet 11/6/96 s. 133 Dele af dette kapitel, er lige som det forrige, inspireret af Kasper Østerbye s slide, som er anvendt i en tidligere version af kurset. 133

Overordnet motivation. Ide: Ikke blot applikationsdata, men også programbeskrivelse og køretidsstrukturer er objekter. Hvis programbeskrivelse er objekter, kan et objekt-orienteret program reflektere om sig selv, og andre programmer. Et program (et objekt) kan undersøge sin egen beskrivelse. Eksempel: Hvilke subklasser findes der af min klasse? Man kan slå bro mellem applikationsobjekter og programbeskrivelse. Eksempel: objekter kan skabes ved at sende beskeder til klasser. Eksempel: det er muligt at ændre på klassen af objekter fra programmet. Værktøjer i en programmeringsomgivelse kan programmeres umiddelbart i det objekt-orienterede sprog. Eksempel: Det er muligt at programmere en browser i Smalltalk, idet der via objekter og beskeder er adgang til de nødvendige informationer. Kurt Nørmark, Aalborg Universitet 11/6/96 s. 134 134

Motivation for metaklasser i Smalltalk. Ræsonnement som leder til metaklasser Objekter er instanser af klasser. Vi ønsker at også klasserne er objekter. Derved kan vi sende beskeder til klasser, herunder instantiering og initialisering. Hvad er klassen af en klasse? Svar: En metaklasse. En metaklasse er en klasse, hvis instans er en klasse. Problem: Hvad er klassen af en metaklasse? Hvis ræsonnementet ovenfor gentages får vi skabt et uendeligt antal niveauer af metaklasser. I Smalltalk skal der findes en praktisk løsning på dette problem. Kurt Nørmark, Aalborg Universitet 11/6/96 s. 135 Givet designprincipperne for Smalltalk, som vi studerede i forrige kapitel, argumenterer vi på denne side for metaklassebegrebet i Smalltalk. Vi argumenterer også for, at vi meget let (ved gentagelse af argumentet) kan komme til at introducere et uendeligt antal metaklasser (metaklasser, meta-metaklasser, metameta-meta-klasser etc.) Dette er ikke praktisk, om end ikke nødvendigvis en umulig tanke. Vi vil senere i kapitlet vende tilbage til, hvordan Smalltalk løser det omtalte problem. Men først vil vi se på, hvilke alternative tilgangsvinkler der er på problemet. 135

Idealet - problemet - alternativer. Idealet. Alle data er objekter. Alle objekter er beskrevet af en klasse. Problemet. Når en klasse opfattes som data, introduceres der en uendelig kæde af meta i klasser, i >= 0. Alternativer Kun applikationsdata er objekter. Alle data, bortset fra klasser, er objekter. Dette er løsningen i langt de fleste konventionelle objekt-orienterede sprog. Giv afkald på klasser: Ingen objekter er beskrevet af en klasse. (Self). Lazy metaklasser: Skab metaklasser efter behov. Lav en sløjfe: Introducer en løkke, f.eks. således at en klasse på et eller andet niveau bliver sin egen metaklasse. Kurt Nørmark, Aalborg Universitet 11/6/96 s. 136... Integer class class Integer class Integer 123 I figuren til højre betegner X class klassen af objektet refereret af X. Beskeden class er tilgængelig i Smalltalk på alle objekter. 136

Metodeopslag i Smalltalk. Når der sendes en besked til et objekt lokaliseres klassen af objektet, og i denne klasse, samt dennes superklasser, søges efter en metoden med en selektor der matcher beskeden. push: 5 copy En stak Objekt Array Stak copy push: instans af klasse En klasse Et objekt Metode Beskeder Objekt Klasser Besked selektorer Superklasse Besked til obj. Kurt Nørmark, Aalborg Universitet 11/6/96 s. 137 På denne slide repeterer vi metodeopslagsprincippet, og vi giver et eksempel, hvor vi sender et par beskeder til et stakobjekt. 137

Simpel metaklasse i Smalltalk. Alle klasser er instans af netop én metaklasse. A B C Class new instans af klasse. klasse-objekt alm objekt Metode instanser klasser metaklasse Konsekvenser: Alle klasser deler den samme protokol. Med andre ord: alle klasser har præcist den samme opførsel. Alle klasser instantieres på den måde, som Class foreskriver: med new. I klassen Class: new obj obj := self basicnew. ^ obj initialize Kurt Nørmark, Aalborg Universitet 11/6/96 s. 138 Ovenfor ser vi situationen, som den kunne se ud hvis Smalltalk kun understøttede én metaklasse. Vi ser, at alle klasser er instanser af denne. Vi har skitseret metoden new, som den kunne se ud i dette hypotetiske system. Når vi siger A new sendes beskeden new til klassen A, som er et objekt. Efter det sædvanlige metodeopslagsprincip lokaliseres metoden i klassen af dette objekt, altså i metaklassen class. Beskeden basicnew foretager selve instantieringen. obj refererer nu til en instans af A, som vi straks sender beskeden initializie. Metoden initialize lokaliseres (igen efter det sædvanlige metodeopslagsprincip) i klassen A (eller i en superklasse). Vi forestiller os her, at initialize foretager en eller anden default initialisering af instansvariable (måske ala den vi kender fra bl.a. Simula og Eiffel). Bemærk at new er ens for alle klasser, men at initialize sendes til et almindelig objekt, og derfor lokaliseres i klassehierarkiet (hvori klasserne A, B og C indgår på en eller anden måde). Initialiseringen kan derfor fint tilpasses de enkelte klasser. 138

Et mere udviklet metaklassebegreb. Hver klasse har sin egen metaklasse. Metaklasserne er struktureret i et klasssehierarki, der er parallelt med klassehierarkiet af de almindelige klasser. A MetaA A MetaA B C MetaB MetaC B C D MetaB MetaC MetaD Konsekvenser: Det er muligt at have klassespecifikke instantierings/initialiseringsoperationer. Date today. Date day: 8 month: 5 year: 1994. Kurt Nørmark, Aalborg Universitet 11/6/96 s. 139 Figuren til højre uddyber situationen til venstre, for så vidt angår hierarkiet af klasser og metaklasser. På næste side vil vi tage udgangspunkt i figuren til højre, og tilføje de klasser, som i Smalltalk afrunder klassehierarkiet. 139

Afrunding af klassehierarki og metaklassehierarki. Object er roden i klassehierarkiet. Metaklasser har ikke navne, men returneres af beskeden class sendt til en klasse. Klassen Class er superklasse for alle metaklasser. instans af klasse. klasse-superklasse Object Metaklasserne er alle instanser af klassen MetaClass specielt er metaklassen MetaClass class en instans af MetaClass. Den fælles protokol mellem metaklasserne og MetaClass er faktoriseret ud i en klasse, som hedder Behavior Behavior Class MetaClass Object class A A class Behavior class B C D B class C class D class Class class MetaClass class Kurt Nørmark, Aalborg Universitet 11/6/96 s. 140 Det er naturligt, at MetaClass er en instans af MetaClass class. Således forholder det sig også med de øvrige klasser, vi har på figuren. Men MetaClass class er også selv en instans af MetaClass. Her har vi altså introduceret en cirkularitet, som består af to klasser, som indbyrdes er instanser af hinanden. Dette er sløjfen i Smalltalk, hvormed vi undgår et uendeligt antal niveauer af metaklasser. Vi har ikke ovenfor medtaget klassen, der hedder ClassDescription. Denne klasse er en subklasse af Behavior, og både Class og MetaClass arver fra ClassDescription. Man kan altså sige, at den ovenfor viste klasse Behavior er faktoriseret ud i den egentlige klasse Behavior, og i klassen ClassDescription. Årsagen er den omfattende protokol af beskeder, som findes i Behavior og ClassDescription (se senere i dette kapitel, hvor vi giver en kort oversigt over disse). Det er instruktivt at følge instans-af relationen (den stiplede relation) så langt man kan komme. Tag f.eks. udgangspunkt i objektet 7: 7 -> SmallInteger -> SmallInteger class -> Metaclass -> Metaclass class -> Metaclass -> Metaclass class ->... Bemærk, at man kan blive ved i det uendelige, men at klasserne gentager sig selv med perioden 2. 140

Instantiering og initialisering af objekter. Stak Stak class initialize initializewith: new with: I klassen Stak class: new ^ super new initialize with: initarray ^super new initializewith: initarray I klassen Stak: initialize elements := Aray new: 100. top := 0 initializewith: initarray elements := initarray. top := initarray size Kurt Nørmark, Aalborg Universitet 11/6/96 s. 141 Moralen er, at man ikke fra en klassemetode (en metode som bor i en metaklasse) kan tiltvinge sig adgang til det ny-allokerede objekts tilstand. Årsagen er, at instansvariable kun kan ses fra instansmetoder (metoder som bor i klassen). Derfor bliver vi nødt til at lave en instansmetode (en metoder som bor i klassen), som vi ovenfor til venstre giver selektoren initialize. Beskeden initialize sendes fluks til det nye objekt. Bemærk, at vi kan gøre dette én gang for alle, i metoderne new og with: ovenfor. Når vi fra en applikationssammenhæng skal lave nye objekter er dette meget praktisk, idet vi ikke skal sige men blot f.eks. Stak new initialize Stak new. 141

Skabelse af klasser og metoder. En klasse NyKlasse med instans variable a, b og c og klassevariable x, y og z i kategorien kat laves ved at sende en besked til superklassen: SuperClass subclass: #NyKlasse instancevariablenames: a b c classvariablenames: x y z pooldictionaries: category: kat En ny metode med selektor sel og krop krop i klassen C under kategorien metokat laves ved at sende en besked til C. C compile: sel krop classified: #metokat Kurt Nørmark, Aalborg Universitet 11/6/96 s. 142 Denne slide repeterer de vigtige metoder, der skaber en ny klasse og en ny metode. Førstnævnte metode bor i klassen Class. Sidstenævnte bor i klassen ClassDescription. Vi vil komme tilbage til begge lidt længere fremme i kapitlet. 142

Klassen Object. Klassen Objekt definerer en protokol af beskeder, som alle objekter kan svare på. Et repræsentativt udvalg af Object s protokol: class returnerer modtagerens klasse ismemberof: aclass returnerer hvorvidt dette objekt er aclass == anobject returnerer om dette obj. og anobject er identiske. copy returnerer en kopi af modtageren deepcopy shallowcopy at: index returnerer værdi af indiceret instansvariabel at: index put: anobject ændrer værdi af indiceret instansvariabel. printstring udskriver en beskrivelse af modtagerobjektet doesnotunderstand: amessage fejl: modtageren forstår ikke beskeden subclassresponsibility fejl: en subklassse skulle implementere metode Kurt Nørmark, Aalborg Universitet 11/6/96 s. 143 For detaljer se kapitel 6 af Smalltalk 80 -- The Language and its Implementation. 143

Klassen Behavior (1). Klassen Behavior definerer en protokol af beskeder for alle objekter (klasser og metaklasser) hvoraf vi kan lave instanser. Skabelse af: Metode dictionaries. Instanser. Klassehierarki. Tilgang til og undersøgelse af Metode dictionaries. Instanser af klassen Instans- og klassevariable. Klassehierarkiet. Enumerering over subklasser og instanser. Kurt Nørmark, Aalborg Universitet 11/6/96 s. 144 Behavior har mange forskellige metodoer. Denne slide giver en overblik over protokollerne i klassen. På næste slides vises et udsnit af metoderne i Behavior, som forhåbentlig giver en god konkret fornemmelse af, hvad klassen tilbyder. Den fulde protokol er beskrevet i kapitel 16 af Smalltalk 80 -- The Language and its Implementation. 144

Klassen Behavior (2). Eksempler på metoder i Bahaviors protokoller: addselector: selector withmethod: compiledmethod compile: code new new: aninteger superclass: aclass removesubclass: aclass selectors allinstances allinstvarnames subclasses superclass canunderstand: selector allsubclassesdo: ablock tilføj en metode til klassens metode dictionary. oversæt udtrykkene i code i denne klasse returner en instans af modtageren returnerer en instans me indicerede variable. sætter superklassen af denne klasse. fjener en subklasse af denne klasse. returnerer alle selektor i denne klasse returnerer mængden af alle instanser returnerer et array af alle instans variable returnerer mængden af alle direkte subklasser returnerer superklassen af denne klasse svarer denne klasse på besked med selector? Evaluerer blokken på alle klassens subklasser. Kurt Nørmark, Aalborg Universitet 11/6/96 s. 145 På næste side vises et repræsentativt udsnit af protokollen af ClassDescription. 145

Klassen ClassDescription. ClassDescription er en subklasse af Behavior, og en superklasse af Class og Metaclass. ClassDescription indeholder således ligesom Behavior en subprotokol af beskeder for alle objekter (klasser og metaklasser) hvoraf vi kan lave instanser. ClassDescription repræsenterer klasse navn, kommentar, navngivning af instansvariable samt output af klasser til filer. Et repræsentativt udvalg af ClassDescriptions protokol: name comment: astring addinstvarname: astring removeinstvarname: astring category: astring fileouton: afilestream fileoutcategory: categoryname compile: code classified: heading returnerer navnet af denne klasse returnerer kommentaren af denne klasse sætter kommentaren af denne klasse definerer en instansvariabel i denne klasse fjerne en instansvariabel i denne klasse returnere denne klasses kategori indsætter/omplacerer klassen ny kategori gem denne klasse på en fil gem klassens categoryname metoder metodeskabelse. Kurt Nørmark, Aalborg Universitet 11/6/96 s. 146 146

Klasserne Metaclass og Class. Metaclass definerer protokollen af beskeder på alle metaklasser. subclassof: supermeta returnerer en subklasse af supermeta. Klassen Class definerer en protokol af beskeder på klasser, som ikke er metaklasser. Repræsentationen af klassevariable. Mere tilgængelige beskeder på klasser end i Behavior. addclassvarname: astring removeclassvarname: astring tilføjer en klassevariabel til denne klasse fjerner en klassevariabel fra denne klasse SuperClass subclass: #NyKlasse instancevariablenames: ivstring classvariablenames: cvstring pooldictionaries: poolvarstring category: categorystring Kurt Nørmark, Aalborg Universitet 11/6/96 s. 147 Hvis vi eksempelvis sender en besked til metaklassen A class, vil vi lokalisere den ønskede i metode i protokollen af Metaclass. Bemærk at det er i protokollen af Class at vi finder den bekendte besked subclass:instancevariablenames:classvariablenames:pooldictioraries:category 147

Automatisk skabelse af access metoder til instansvariable. accessingsubclass: classname instancevariablenames: instvarstring classvariablenames: classvarstring pooldictionaries: stringofpoolnames category: categoryname newclass newclass := self Subclass: classname instancevariablenames: instvarstring classvariablenames: classvarstring pooldictionaries: stringofpoolnames category: categoryname. newclass instvarnames do: [ :aname newclass compile: (aname, ^, aname) classified: #accessing. newclass compile: (aname, : arg, aname, := arg. ^ arg ) classified: #accessing]. ^newclass Object accessingsubclass: #Record instancevariablenames: top el classvariablenames: pooldictionaries: category: Example top ^top Metode i klassen Class top: arg top := arg. ^ arg Kurt Nørmark, Aalborg Universitet 11/6/96 s. 148 el ^el el: arg el := arg. ^ arg Ovenstående viser en metode i klassen Class. Det er en variation af klassedefinition, hvor accessor metoder genereres automatisk. Dette svarer altså til mulighederne i CLOS (reader, writer metoder). Beskeden instvarnames besvares af klassen Behavior (se slide om denne lidt tidligere i dette kapitel). Forneden illustreres en anvendelse på en klasse (Record) med to instansvariable. Vi ser, at der genereres fire metoder. 148