Rename og redefine. Abstrakte klasser. Dynamisk binding.
|
|
- Alfred Lindegaard
- 7 år siden
- Visninger:
Transkript
1 11 Nedarvning II. Enkeltnedarvning i Eiffel. Rename og redefine. Initialisering af superklasse-dele af et objekt. Interfaces til klienter og subklasser. Typesammenlignelighed og polymorfi. Abstrakte klasser. Dynamisk binding. I dette kapitel vil vi studere emnerne fra Nedarvning I i en større detalje, og fra et Eiffel perspektiv. 155
2 Eiffel klasser med enkelt nedarvning. Syntaks: class name inherit superklasse rename navne tilpasninger export eksport tilpasninger redefine redefinitions tilpasninger tilpasning af nedarvede egenskaber fra superklasse. creation liste af navne på creation procedurer s Denne slide viser en skabelon af en klasse i Eiffel i det tilfælde, at der kun arves fra én superklasse. I det markerede afsnit på billedet ovenfor angives det, hvordan egenskaberne fra superklassen tilpasses, når disse egenskaber skal betragtes som være (nedarvede) egenskaber i klassen name. Bemærk at renaming, export og re-definition skal angives i netop ovenståe rækkefølge. Der findes to andre tilpasningsmuligheder: undefine og select. Undefine vil vi ikke bekymre os om i disse noter. (Hvis du er interesseret eller nysgerrig se afsnit i Eiffel the Language ). Select kommer vi ind på i forbindelse med mulitipel nedarving. I dette kapitel ser vi nærmere på de de forskellige tilpasningsmuligheder. 156
3 Rename i Eiffel. A f, h class B rename f as g, h as j andre tilpasninger Det overordnede problem: Hvis et navn er defineret i A kan navnet ikke umiddelbart benyttes til en i B. B Hvorfor bruge rename i klassen B? Give adgang til s i superklasser, som har samme navn som i B. For at klienter og subklasser af B kan benytte A-s med naturlig terminologi. For at løse op for navnesammenfald ved multipel nedarvning. I Eiffel er tilknytningen af et navn til en egenskab () ikke global og absolut, men relativ til en klasse. Gennem rename-delen under inherit er det muligt at tilpasse navnene på superklasseegenskaber. De nye navne har kun betydning i klassen B (samt dennes subklasser). De gamle navne (navnene på egenskaber i A, som bliver renamet i B s klassedefinition) er i klassen B totalt løsrevet fra deres A-betydning. De gamle navne kan således bruges som -navne i B, hvis vi måtte ønske dette. Det er noget meget grundlægge i Eiffel, at navne på s i en klasse entydigt skal referere til netop én. I andre sprog, f.eks. C++ kan vi godt bruge det samme navn til en variabel eller operation i en klasse og i dens superklasse, men det er naturligvis også i dette sprog vigtigt, at vi præcist er i stand til at sige, hvilken af variablene eller operationerne vi egentlig ønsker at referere til. I C++ skal man defor i anvelsessituationen kvalificere det tvetydige navn med klasse navnet: class::name. Den tredie årsag til at bruge rename er kun relevant hvis en klasse har mere én superklasse (multipel nedarvning). Hvis en klasse C arver fra to eller flere klasser, som begge har en f, hvilken f skal så gælde i C? En måde at løse dette tvetydighedsproblem på, er at kræve, at mindst én af f-erne 'renames'. 157
4 Redefine i Eiffel. Kontrolleret overskrivning A B f f class B evt. renamings evt. export tilpasninger redefine f f() is --f --B Ikke arbitrære redefinitioner: Signaturen af redefinitionen skal være sammenlignelig med den oprindelige signatur. Specifikationen af redefinitionen skal være en delspecifikation af den oprindelige specifikation. En parameterløs funktion kan redefineres til en attribut, men ikke omvt. Hvorfor bruge redefine i klassen B? Tildele en ny mening til navnet i B (Overskrive betydningen fra superklassen). Renaming er udtryk for en syntaktisk (næsten kosmetisk) ændring af programmet, eller det kan være nødvig på grund af 'uheldig' valg af navne i superklasser. Redefine er derimod udtryk for en mere substantiel, semantisk ændring, hvor meningen af et navn, f.eks. en procedure, ændres. Navnene i under redefine er de navne, som er gælde efter evt. tilpasninger efter rename. Det vigtigste at få fat i omkring redefinition er hvorfor vi benytter os af det: for at introducere en ny mening af en eller andet egenskab, som arves fra superklassen. Men det er naturligvis også væsentligt at forstå de begrænsninger, som redefinition i Eiffel er underlagt. Én af disse begrænsninger er, at en variabel kan ikke redefineres til en funktion (eller procedure), idet man ikke kan assigne til en funktion. Signaturen (parameterprofilen) af en udtrykker typer af formelle parametre og resultattypen. Man kan også tale om signaturen af en variabel, nemlig som typen af variablen. (Se også forelæsningen om "Specifikation med logiske udtryk"). Se evt. også Eiffel the Language, afsnit 5.12 samt 13.3 for en uddybning af signaturbegrebet hhv. signatursammenlignelighed. Hvad det vil sige, at en specifikation er en delspecifikation af en anden, ver vi tilbage til i næste forelæsning. Begrænsningerne i de to førte punkter på sliden ovenfor sikrer, at man ikke på må og få kan omdefinere operationer (og variable) i subklasser. Såvel signatur som specifikation, som angivet i en superklasse, skal overholdes af redefinitioner i subklasser. At signaturen af en redefinition er sammenlignelig med den oprindelige signatur betyder for parametrenes vedkomme, at parametrene parvis er sammenlignelige. Specielt har vi, at en operation f i klassen A og den redefinerede f i B skal have samme antal parametre. En parameter i den redefinerede klasse skal altså være (identisk med, eller) en subklasse af parameteren i den oprindelige klasse. Dette kaldes med et fint ord for covarians. Det kan diskuteres, om dette er det rigtige valg. Nogle argumenterer for, at det modsatte (kontravarians ) skal være gælde. Senere i kurset ver vi tilbage til forskellene mellem covarians og kontravarians. 158
5 Klientinterfacet i forbindelse med nedarvning. En klasse har fuld kontrol over sin klientinterface relativ til superklassens klientinterface. Som grundregel beholder s deres eksportstatus under nedvarning. Under nedarvning er det g muligt at tilpasse nedarvede egenskabers eksportstatus: Tilføje en til klientinterfacet. Fjerne en nedarvet fra klientinterface. Håndtere alle nedarvede s under ét. Man kan selektivt eksportere til udvalgte klasser (og deres subklasser). Eksempel 1: class B -- har s x, y og z export {ANY} x; {C} y; {NONE} z Eksempel 2: class B export {NONE} all {ANY} x I Eiffel er der ingen form for synlighedkontrol mellem en klasse og dens subklasser. Generelt overtager en subklasse (B) superklassens (A s) klientinterface, men superklassen (A) dikterer ikke på nogen måden subklassens (B s) klientinterface. I export-delen af inheritance af B kan man helt igennem styre B s interface til sine klienter. Eksempel 1 ovenfor illustrerer dette. Uanset A s eksportpolitik vil B, som jo arver x, y og z fra A, stille x tilrådighed for alle klienter, kun eksportere y til C, samt holde z privat. Eksempel 2 ovenfor illustrerer brugen af nøgleordet all i export-delen under inheritance. Meningen er her at alle s arvet fra A bliver private (kan ikke ses af nogen klient til A), undtagen g x, som kan ses af alle (ANY) klienter. Det kan være af interesse at vide, at I Eiffel2 var angivelsen af klientinterfacet væsentlig enklere, men måske lidt mere træls at håndtere i praksis. I Eiffel2 havde hver klassen en eksplicit export liste, som hver klasse i et nedarvningshierarki kunne danne helt uafhængig af superklassens export liste. Dog var der mulighed for i en eksportlist at sige repeat super-klasse, for på denne måde enkelt at kunne udtrykke udvidelse af klient-forhold i forhold til superklassens klient-forhold. 159
6 Creation procedurer i forbindelse med nedarvning. Hver klasse lister sine creation procedurer. Creation status af procedurer nedarves ikke. Gennem evt. anvelse af renaming er det muligt at benytte superklassens creation procedure (x fra A) i subklassens creation procedure (x i B). Creation status af en creation procedure i A (muligheden for at anve creation proceduren til instantiering) er uafhængig af procedurens eksport status (muligheden for at anve proceduren på et objekt af typen A). class A creation x x() is class B rename x as x_from_a export creation x, z x() is x_from_a() z() is Denne slide beskæftiger sig med et ligne emne som forrige slide. Spørgsmålet der besvares er hvorledes creation procedurer forholder sig til nedarvning. Det er væsentligt at slå fast, at udnævnelse af creation procedurer finder sted i hver klasse i et klassehierarki. Man kan ikke blot læne sig op ad superklassens creation procedure liste. Det er også væsentligt at få fat i hvordan to creation procedurer i to niveauer i et klassehierarki kan bruge hinanden. Altså hvordan B s creation procedure kan kalde A s creation procedure relativ til billedet ovenfor. Dette er et ofte forekommede ønske, idet A s creation procedure initialiserer A-attributter, og B s creation procedure initialiserer B s attriutter. Det vil være bbeltarbejde hvis vi i B s creation procedure skulle dublere arbejdet i forhold til A s creation procedure; det er naturligvis det bedste blot at kunne kalde A s creation procedure fra B s. Det er ofte også tilfældet, at creation procedurer hedder det samme på tværs af klasser i et hierarki (typisk make eller create). Bemærk at vi ikke ovenfor redefinerer x med redefine. Hvis vi redefinerede x ville B s x (bl.a.) være tvunget til at have samme parameterantal som A s x. Dette kan vi typisk ikke leve med for creation procedurer (der kommer ofte flere og flere parametre på creation procedurer, jo flere superklasser den omkringligge klasse af proceduren har). 160
7 Typesammenlignelighed og polymorfi i Eiffel. Lad B være en direkte subklasse af A. B er da direkte typesammenlignelig med A. A B Eksempel: A B og C er direkte typesammenlignelige med A. D og E er typesammenlignelige med A. B C D E x: A; x A- egenkaber C egenkaber D egenkaber E egenkaber y: E y A- egenkaber Instans af A Instans af E Direkte typesammenlignelighed er, som man husker, den primitive relation, som tillader os at definere den mere interessante relation 'typesammenlignelighed'. Sidstnævnte er defineret som den transitive refleksive lukning af 'direkte typesammenlignelighed'. Bidraget til typesammenlignelighed, som defineret på denne slide, definerer en begrænset og kontrolleret form for polymorfi. En instans af en mere specialiseret klasse kan assignes til en variabel af en mere generel klasse. Dette er en "typesikker" assignment, idet vi ved, at en specialiseret type har alle de egenskaber, som den generelle type besidder. Som det illustreres på denne slide, gælder det omvte ikke. Hvis det var lovligt at tilskrive et generelt objekt til en mere specifik kvalificeret variabel, kan vi ikke på programmets oversættelsestidspunkt forhindre, at der bliver spurgt om udefinerede egenskaber af objekter. I eksemplet y.d-egenskab går det galt hvis y peger på en instans af klassen A. 161
8 Dynamisk binding i Eiffel. X: A; Y: B;!!Y.create(); X := Y; X.op() op fra klassen A eller fra klassen B? class A op () is --A class B redefine op op () is I Eiffel: op fra klassen B. --B Eiffel bruger konsekvent dynamisk binding.x Betegnelsen virtuelle operationer bruges ikke i Eiffel. Det kan virke lidt overflødigt skulle skrive 'redefine op', når det jo klart fremgår af klasse definitionen, at operationen op rent faktisk (re)defineres. Eiffel filosofien omkring dette er, at programmøren skal udtrykke sig lidt redundant (hvilket jo vil sige, at man bruger lidt flere ord nødvigt), for derved at markere, at operationen ikke blot forekommer ved et uheld både i klassen A og B. Det skal være programmørens intension, at redefinere den udgave af op, som han er bevidst om også findes i A. Det er værd at bemærke, at hvis formålet med!!y.create(); X := Y; udelukke er at tildele X en reference til et B-objekt kan man nøjes med! B!X.create(). Dette udnytter den fulde styrke i sprogets objektskabelses mekanisme. 162
9 Typesammenlignelighed og reverse assignment attempt. Bus Køretøj Truck k: Køretøj; b: Bus; t: Truck;!!b.create;!!t.create; k := b; b := k; b := t; -- ok i Eiffel og andre OO sprog. -- ulovligt i Eiffel, men lovligt -- i nogle andre OO sprog. -- ulovligt i alle OO sprog.!!b.create;!!t.create; k := b; b?= k; if b.void then ; -- ok Eiffels reverse assignment attempt: Det testes under programudførelsen om den dynamiske type af k er typesammenlignelig med den statiske type af b. Hvis ja: udfør normalt assignment. Hvis nej: assign void til b. Hovedpointen på denne slide er, at assignmentet b := k kun er lovligt, hvis k refererer til en bus (eller til et objekt, som er en specialiseret bus). Det kan vi kun vide ved at teste det på programmets udførelsestidspunkt. I Eiffel er dette "run time check" en del af det specielle assignment b?= k, som kaldes et reverse assignment attempt. Bemærk, at et "run time check" aldrig er nødvig ved assignmentet k := b, idet b altid vil referere til et objekt, som er en bus, eller til et objekt, som er instans af en subklasse af bus. Et assignment var := expr er typemæssigt lovligt hvis typen af expr er typesammenlignelig med typen af var. Et reverse assignment attempt var?= expr er typemæssigt lovligt hvis typen af var er typesammenlignelig med typen af expr; altså præcist den omvte betingelse. Ovennævnte b?= k opfylder klart denne regel. Reglen udlukker k?= b, b?= t og t?= b (alle med reference til billedet ovenfor) som lovlige reverse assignment attempts. Reglen er fornuftig derved, at den kun er gyldig, hvis der er tvivl om den typemæssige lovlighed af assignment (forsøget), og hvis der er håb om, at forsøget kan give success. Man kan læse om reverse assignment attemps i afsnit af "Eiffel the Language". Det er værd at bemærke, at der i klassen ANY findes en funktion som hedder conforms_to, og som på programmets udførelsestidspunkt tillader os at undersøge om et objekts type er sammenlignelig med et andet objekts type. Funktionen bruges således: x.conforms_to(y). Svaret er true hvis den dynamiske type af x er typesammenlignelig med den dynamiske type af y. 163
10 Abstrakte klasser i Eiffel. Abstrakt klasse med forudannonceret routine f. deferred class A inherit creation create f () is deferred ; --f g: T is deferred x: A;!!x.Create class B creation create f() is ; --f g: T x: A; y: B!!y.Create; x := y I Eiffel er en klasse abstrakt hvis den indeholder én eller flere s, der er mærkede deferred. En abstrakt klasse i Eiffel skal mærkes med nøgleordet deferred i forbindelse med klassedefinition. I eksemplet ovenfor arver klassen B fra klassen A. B siges at effektuere (eng.: effect ) f og g. Som det ses, er B således ikke abstrakt (vi antager at der ikke er andre abstrakte egenskaber f og g i A). Vi skal (og må) ikke eksplict skrive redefine f når en egenskab effektueres. I eksemplet ovenfor ser vi at g er en deferred funktion uden parametre i klassen A. I klassen B kan vi naturligvis effektuere g som en funktion. Men som illustreret, er det også muligt at effektuere g som en attribut. Man kan således se, at formen g: T is deferred i A lader det stå åbent, om vi i en subklasse vil realisere g som en beregning af en værdi (en parameterløs funktion) eller som en lagret værdi (en attribut). Undertiden omtaler man en klasse som en effective class (i betydningen at den er af egentlig nytte, tjenestdygtig) hvis den ikke er deferred. 164
11 Abstrakt klasse med specifikation: Stack (I). class STACK[T] nb_elements: INTEGER is deferred ; push(x: T) is require not full deferred ensure not empty; top = x; nb_elements = old nb_elements + 1; pop is require not empty derferred ensure not full; nb_elements = old nb_elements -1 ; --pop top: T is require not empty deferred ensure Nochange ; -- top --fortsættes Vi benytter påny stakke som et eksempel. Der er ingen repræsentationsaspekter i Stack. Repræsentationsbeslutninger udsættes til en subklasse. nb_elements er nu ikke en integer, men en forudannonceret af typen integer, hvis implementation afhænger af repræsentationsvalget. Vi kan således i en subklasse vælge at lagre eller beregne antallet af elementer. Vi ønsker ikke apriori at begrænse stakke til at have en øvre grænse. Dette afspejles af invarianten derved, at der ikke er angivet en øvre grænse af nb_elements. Vi kunne vælge at realisere stakke med en dynamisk datastruktur (linærere lister), som ikke har en øvre grænse på antallet af elementer. I dette tilfælde skal vi i en subklasse til stack implementere full som en funktion, der altid returnerer false. 165
12 Abstrakt klasse med specifikation: Stack (II). (fortsat) empty: BOOLEAN is require true Result := (nb_elements = 0) ensure Result = (nb_elements = 0) ; full: BOOLEAN is deferred ;--full change_top(x: T) is require not empty pop; push(x) ensure not empty; top = x; nb_elements = old nb_elements ; --change_top invariant 0 <= nb_elements; --class stack Change_top er en ny operation. Operationen udskifter toppen af stakken med parameteren. Denne operation er ikke forudannonceret, idet vi, uanset specialiseringen af stack, kan implementere change_top på dette niveau. 166
13 Eksempel på en abstrakte klasse fra Eiffel bibliotekerne. deferred class PART_COMPAR infix "<" (other: like Current): BOOLEAN is deferred ; -- "<" infix "<=" (other: like Current): BOOLEAN is Result := (Current < other) or (is_equal (other)) ; -- "<=" infix ">" (other: like Current): BOOLEAN is Result := other < Current ; -- ">" infix ">=" (other: like Current): BOOLEAN is Result := (other < Current) or (is_equal (other)) -- ">=" -- class PART_COMPAR Klassen PART_COMPAR definerer fire forskellige sammenligningsoperationer på objekter, hvorpå vi introducerer en partiel ordning (<). Vi minder om, at en partiel ordning pr. definition er transitiv (x < y og y < z => x < z) og irrefleksiv (x < x er falsk for alle x). Via transitivitet og irrefleksivitet har vi også anti-symmetri (x < y => not (y < x) ). Klassen PART_COMPAR er fra kerne-biblioteket i vores Eiffel system. Det ses hvordan operatorerne <=, > og >= kan defineres ud fra < og equal. Bemærk at < er den eneste forudannoncerede (deferred) operation i klassen. Is_equal er arvet fra klassen ANY, hvorfra enhver klasse i Eiffel arver. Det er nu intentionen, at subklasser af PART_COMPAR skal definere operationen <; derved får man de andre "gratis". Eksemplet viser også brug af såkaldte forankrede typer i Eiffel (type erklæringer som 'other: like Current') og infix operator funktioner ('infix "<"(): boolean'). Hverken forankrede typer eller infix operator funktioner bliver behandlede eksplicit på dette kursus. Interesserede henvises til hhv. afsnit "Eiffel the Language" angåe forankrede typer. 167
Udvidelse og specialisering. Klassehierarkier. Nedarvningsterminologi. Interfaces. Statiske og dynamiske typer. Polymorfi. Abstrakte klasser.
10 Nedarvning I. Udvidelse og specialisering. Klassehierarkier. Nedarvningsterminologi. Interfaces. Statiske og dynamiske typer. Polymorfi. Dynamisk binding og virtuelle operationer. Decentraliseret/centraliseret
Læs mere29 Opsamling af Objekt-orienteret Programmering.
29 Opsamling af Objekt-orienteret Programmering. Bottom-up kontra top-down design. "The shopping list approach". Hvordan finder man på objekterne. Klasser og dataabstraktion. Klasse interface og interface-teknikker.
Læs mere4 Basal Objekt-orienteret Programmering I.
4 Basal Objekt-orienteret Programmering I. Klasser i forhold til abstrakte datatyper og record-typer. Variable og operationer. Klasse-interfaces. Klasser og typer. Klasse-instantiering og initialisering.
Læs mere12 Nedarvning III. Noter. Multipel nedarvning. Nedarvning og assertions. PS1 -- Nedarvning III. Kurt Nørmark, Aalborg Universitet, 1994.
12 Nedarvning III. Multipel nedarvning. Nedarvning og assertions. 169 Multipel nedarvning. A C Klassen C arver egenskaberne fra både A og. A og egenskaber er umiddelbart tilgængelige i C. x A C x x er
Læs mere30 Objekt-orienteret Programmering i Andre Sprog.
30 Objekt-orienteret Programmering i Andre Sprog. Abstrakte datatyper i Pascal. Abstrakte datatyper i Modula og Ada. C++ Overordnet organisering Instantiering og initialisering. Interfaces. Nedarvning.
Læs mereUgeseddel 4 1. marts - 8. marts
Ugeseddel 4 1. marts - 8. marts Læs følgende sider i kapitel 6 i lærebogen: s. 233 258 og s. 291 317 (afsnit 6.3 overspringes). Begynd at overveje, hvad afleveringsopgaven skal omhandle. Læs vejledningen,
Læs mereÅrsagen til fejl. Erkendelse af fejl. Håndtering af fejl.
9 Fejlhåndtering Årsagen til fejl Erkelse af fejl Håndtering af fejl Fejlerkelse og -håndtering i objekt-orienterede sprog Fejlerkelse og -håndtering i Eiffel Udbredelse af fejl i Eiffel Nuanceret fejlhåndtering
Læs mereVideregående Programmering for Diplom-E Noter
Videregående Programmering for Diplom-E Noter 1. Uddelegering Ét af de væsentlige principper i objektorienteret programmering er, at enhver klasse selv skal kunne "klare ærterne". Enhver klasse skal altså
Læs merePolymorfi. Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type. Coercion
Polymorfi Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type Coercion Tvangskonvertering (forfremmelse og begrænsning) Oversigt Abstrakt klasse abstrakt
Læs mere26 Programbeviser I. Noter. PS1 -- Programbeviser I. Bevis kontra 'check af assertions' i Eiffel. Betingelser og bevisregler.
26 Programbeviser I. Bevis kontra 'check af assertions' i Eiffel. Betingelser og bevisregler. Hvad er programverifikation? Bevisregel for 'tom kommando'. Bevisregel for assignment. Bevisregler for selektive
Læs mereMETODER ARV KLASSER. Grundlæggende programmering Lektion 5
METODER KLASSER ARV Grundlæggende programmering Lektion 5 1 METODER Sekvenser af kode om samme emne 2 REPETITION Række af statements der udfører en handling Mindst én metode der hedder main Forskellen
Læs mere5 Basal Objekt-orienteret Programmering II.
5 Basal Objekt-orienteret Programmering II. Historik og sprogoversigt. Programbeskrivelse kontra programudførelse. Referencer og værdier. Skabelse af objekter i Eiffel. Features og deres klassificering
Læs mere3 Algebraisk Specifikation af Abstrakte Datatyper.
3 Algebraisk Specifikation af Abstrakte Datatyper. Specifikation kontra program. Bestanddele af en algebraisk specifikation. Klassificering af funktioner i en ADT. Systematisk definition af ligninger.
Læs mereclass subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.
Programmering 1999 Forelæsning 11, tirsdag 5. oktober 1999 Oversigt Klasse-hierarkier: superklasser og subklasser Nedarvning Polymorfi Programmering 1999 KVL Side 11-1 Hierarkier En klasse repræsenterer
Læs mereDatalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning
Datalogi OB, Efterår 2002 OH er, forelæsning 10/9-2002 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Eftermiddagens opgave:
Læs mere13 Objekt-orienteret Design.
13 Objekt-orienteret Design. Analyse i forhold til design. Programbeskrivelse og designbeskrivelse. Sømløs udvikling. Design i forhold til OO Eiffel programmering. Kategorisering af klasser i et design.
Læs mereKlasser og Objekter i Python. Uge 46 Learning Python: kap 15-16, 19-22.
Klasser og Objekter i Python Uge 46 Learning Python: kap 15-16, 19-22. Klasser og objekter En klasse beskriver en klump af samhørende funktioner og variable En klasse er en beskrivelse. En kage form Klassens
Læs mere2 Abstrakte datatyper.
2 Abstrakte datatyper. Motivere eksempel: top-down udvikling af program 'mini-bank' Strukturering af et program: efter data eller funktion? Definition af en abstrakt datatype og tilknyttede begreber. Fænomener,
Læs mereSoftware Construction 1 semester (SWC) Spørgsmål 1
Spørgsmål 1 Objekter #1 Giv en kort præsentation af begrebet objekt, samt hvorledes du erklærer(declare), opretter(create) og bruger objekter Du kan beskrive o Datatyper o Variable / Instans variable /
Læs mereDesign by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater
Design by Contract Bertrand Meyer 1986 Design and Programming by Contract Michael R. Hansen & Anne Haxthausen mrh@imm.dtu.dk Informatics and Mathematical Modelling Technical University of Denmark Design
Læs mereObjekt-orienteret programmering uden klasser: Self.
Objekt-orienteret programmering uden klasser: Self. Sammenligning klasse-baseret og klasseløs programstrukturering. Basale forhold Singulære objekter Dynamisk nedarvning Variable i forhold til metoder.
Læs mereForelæsning Uge 4 Mandag
Forelæsning Uge 4 Mandag Algoritmeskabeloner Kan (ved simple tilretningerne) bruges til at implementere metoder, der gennemsøger en arrayliste (eller anden objektsamling) og finder objekter, der opfylder
Læs mereSoftware Construction 1. semester (SWC) januar 2014 Spørgsmål 1
Spørgsmål 1 Grundlæggende objektorienterede begreber o Klasse (class) o Objekt (object) o Metode (method), herunder return type og parametre o Instansvariable (instance variables) & egenskaber (properties),
Læs mereAbstrakte datatyper C#-version
Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype
Læs mereEksempel: Skat i år 2000
Kursus 02199: Programmering afsnit 2.1-2.7 Anne Haxthausen IMM, DTU 1. Værdier og typer (bl.a. char, boolean, int, double) (afsnit 2.4) 2. Variable og konstanter (afsnit 2.3) 3. Sætninger (bl.a. assignments)
Læs mere8 Specifikation med Logiske Udtryk.
8 Specifikation med Logiske Udtryk. Specifikation kontra program. Specifikation af funktioner. Specifikation af funktions-orienterede ADT-er. Integreret specifikation og program i Eiffel. Korrekthed af
Læs mereKlasser og objekter. (Afsnit i manualen)
Klasser og objekter (Afsnit 4 + 5 i manualen) Grundbegreber Klasser og objekter beskrivelse oprettelse Attributter og metoder tilstand opførsel Indkapsling afskærmning datarepræsentationsuafhængighed Klasser
Læs mereForelæsning Uge 4 Mandag
Forelæsning Uge 4 Mandag Algoritmeskabeloner findone, findall, findnoof, findsumof Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder strenge) Opfølgning på Skildpadde
Læs mereTree klassen fra sidste forelæsning
Programmering 1999 Forelæsning 12, fredag 8. oktober 1999 Oversigt Abstrakte klasser. Grænseflader. Programmering 1999 KVL Side 12-1 Tree klassen fra sidste forelæsning class Tree { int age; // in years
Læs mereKlasser og Objekter i Python. Uge 11
Klasser og Objekter i Python Uge 11 Klasser og objekter En klasse beskriver en klump af samhørende funktioner og variable En klasse er en beskrivelse. Klassens objekter er instanser af klassen. En programudførelse
Læs mere16 Træer. Noter. Definition af et træ. Definitioner i tilknytning til træer. Repræsentation af træer. Binære træer. Den abstrakte datatype.
16 Træer. Definition af et træ. Definitioner i tilknytning til træer. Repræsentation af træer. Binære træer. Den abstrakte datatype. Gennemløb af binære træer. Træer i Eiffel. 229 Definition af et træ.
Læs mereSkriftlig eksamen i Datalogi
Roskilde Universitetscenter Skriftlig eksamen i Datalogi Modul 1 Sommer 1999 Opgavesættet består af 5 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 15% Opgave 2 15% Opgave 3 8% Opgave
Læs mere18 Multivejstræer og B-træer.
18 Multivejstræer og B-træer. Multivejs søgetræer. Søgning i multivejssøgetræer. Pragmatisk lagring af data i multivejstræer. B-træer. Indsættelse i B-træer. Eksempel på indsættelse i B-træ. Facts om B-træer.
Læs mereForelæsning Uge 5 Mandag
Forelæsning Uge 5 Mandag Algoritmeskabeloner findone, findall, findnoof, findsumof (sidste mandag) findbest Brug af klassen Collections og interfacet Comparable BlueJ s Debugger Nyttig til at inspicere
Læs mereMetaklasser i Smalltalk.
8 Metaklasser i Smalltalk. Motivation Metodeopslag Simple metaklasser Mere udviklede metaklasser Klasse- og metaklassehierarkiet Instantiering og initialisering Skabelse af klasser og metoder Oversigt
Læs mereSkriftlig eksamen i Datalogi
Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2
Læs mere9 Introduktion til CLOS.
9 Introduktion til CLOS. Klasser Metoder Generiske funktioner Slots Nedarvning Class precedence lists Klasse-redefinition og objektopdatering Ændring af objekters klassetilhørsforhold Eksempler Kurt Nørmark,
Læs mere28 Algoritmedesign. Noter. PS1 -- Algoritmedesign
28 Algoritmedesign. Algoritmeskabelon for Del og Hersk. Eksempler på Del og Hersk algoritmer. Binær søgning i et ordnet array. Sortering ved fletning og Quicksort. Maksimal delsums problem. Tætteste par
Læs mereER-modellen. Databaser, efterår Troels Andreasen. Efterår 2002
Databaser, efterår 2002 ER-modellen Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk
Læs mereObjektorienteret design med arv og polymorfi:
Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Objektorienteret design med arv og polymorfi: Substitutionsprincippet Composite Design Pattern Finn Nordbjerg Side 1 Objektorienteret
Læs mereForelæsning Uge 4 Mandag
Forelæsning Uge 4 Mandag Algoritmeskabeloner Kan (ved simple tilretningerne) bruges til at implementere metoder, der gennemsøger en arrayliste (eller anden objektsamling) og finder objekter, der opfylder
Læs mere15 Arrays og Lister samt Stakke og Køer.
15 Arrays og Lister samt Stakke og Køer. Introduktion til arrays. Algebraisk specifikation af arrays. Arrays i Eiffel. Introduktion til lister og kædede lister. Fælles egenskaber ved stakke og køer. Algebraisk
Læs mereForelæsning Uge 2 Torsdag
Forelæsning Uge 2 Torsdag Java syntax og style guide Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Brug
Læs mereSproget Rascal (v. 2)
Sproget Rascal (v. 2) Til brug i K1 på kurset Oversættere Opdateret 29/11 2004 Abstract Rascal er et simpelt Pascal-lignende imperativt sprog. Dette dokument beskriver uformelt Rascals syntaks og semantik
Læs mereForelæsning Uge 4 Torsdag
Forelæsning Uge 4 Torsdag Algoritmeskabeloner findone, findall, findnoof, findsumof (i mandags) findbest Levetid for variabler og parametre Virkefeltsregler Hvor kan man bruge de forskellige variabler?
Læs mereForelæsning Uge 12 Torsdag
Forelæsning Uge 12 Torsdag Protected access Alternativ til public og private Abstrakte klasser og interfaces En abstrakt klasse er en klasse, som man ikke kan lave instanser (objekter) af En abstrakt klasse
Læs mereIt og informationssøgning Forelæsning december 2006 Jakob Grue Simonsen. Diverse emner af almen interesse
It og informationssøgning Forelæsning 12 6. december 2006 Jakob Grue Simonsen Diverse emner af almen interesse 1 Gemme objekter til filer I python skal en fil på disken åbnes, før man kan læse eller skrive
Læs mereKursus i OOP og Java. Kursus i Objektorienteret programmering i Java
Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger
Læs mere14 Algoritmeanalyse. Noter. Algoritmebegrebet. Hvad er algoritmeanalyse? Problemstørrelse og køretid. Køretid for forskellige kontrolstrukturer.
14 Algoritmeanalyse. Algoritmebegrebet. Hvad er algoritmeanalyse? Problemstørrelse og køretid. O og Ω. Køretid for forskellige kontrolstrukturer. Eksempler på algoritmeanalyse. Eksponentiel og polynomiel
Læs mereForelæsning Uge 12 Mandag
Forelæsning Uge 12 Mandag Protected access Alternativ til public og private Abstrakte klasser og interfaces En abstrakt klasse er en klasse, som man ikke kan lave instanser (objekter) af En abstrakt klasse
Læs mereIt og informationssøgning Forelæsning oktober 2006 Jakob Grue Simonsen. Klasser
It og informationssøgning Forelæsning 7 25. oktober 2006 Jakob Grue Simonsen Klasser Downey, Elkner & Meyers: Chapt. 12-14 Andersen & Simonsen: kap. 7 Vi har tidligere set, at Python tilbyder en række
Læs mereHvad er Objekter - Programmering
Denne guide er oprindeligt udgivet på Eksperten.dk Hvad er Objekter - Programmering En rigtig god gennemgang af hvad objekter er! Hvordan de oprettes og anvendes! Det er helt klart til nybegyndere, som
Læs mereOpfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner
Forelæsning 4.1 Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner finden findalle Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder strenge) Afleveringsopgave
Læs mereÅben uddannelse, Efterår 1996, Oversættere og køretidsomgivelser
3/10/96 Seminaret den 26/10 vil omhandle den sidste fase af analysen og de første skridt i kodegenereringen. Det drejer sig om at finde betydningen af programmet, nu hvor leksikalsk og syntaktisk analyse
Læs mereKlasser og nedarvning
Datalogi C, Efterår 2004 OH er, forelæsning 21/9-2004 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Opgaven til senere: Generalisere
Læs mereForelæsning Uge 3 Mandag
Forelæsning Uge 3 Mandag Niveauer af programbeskrivelser Statiske / dynamiske beskrivelser ArrayList Collection med variabelt antal elementer Der er mange andre Collection typer (se Collection interfacet
Læs mereForelæsning Uge 2 Mandag
Forelæsning Uge 2 Mandag Objekters tilstand og opførsel BlueJ og Greenfoot Java Skabelse af objekter (via new-operatoren) Iteration (gentagelser) og parametrisering Forskellige slags variabler Afleveringsopgave:
Læs mereAlgoritmeskabeloner: Sweep- og søgealgoritmer C#-version
Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte
Læs mereExceptions i Delphi. Try except
Exceptions i Delphi Exceptions er en teknik til at fange fejl under programafviklingen. Ikke programmeringsfejl, men fejl der opstår i forskellige situationer, f.eks. en fil der mangler en fil der er skrivebeskyttet,
Læs mereER-modellen. Databaser, efterår 2002. Troels Andreasen. Efterår 2002
Databaser, efterår 2002 ER-modellen Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk
Læs mereAAU, Programmering i Java Intern skriftlig prøve 18. maj 2007
AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til fjj@noea.dk. Besvarelsen skal
Læs mereForelæsning Uge 4 Torsdag
Forelæsning Uge 4 Torsdag Algoritmeskabeloner findone, findall, findnoof, findsumof (sidste mandag) findbest Levetid for variabler og parametre Virkefeltsregler Hvor kan man bruge de forskellige variabler?
Læs mereUML til kravspecificering
UML til kravspecificering UML mini-kompendium - til brug i forbindelse med modellering af kravspecifikationer. Copyright 2006 Teknologisk Institut, IT-Udvikling Aktivitetsdiagram 2/9 Aktion Aktionsnavn
Læs mereForelæsning Uge 6 Mandag
Forelæsning Uge 6 Mandag Tingene i denne forelæsning er ikke eksamenspensum Forelæsningen afrunder kurset, og forklarer nogle af de begreber, som I har mødt under kurset uden at få detaljeret forklaring
Læs mereKommentar fra KMS til Specifikation af Serviceinterface for Person
Kommentar fra KMS til Specifikation af Serviceinterface for Person Organisation Side Kapitel Afsnit/figur/tabel /note Type af kommentar (generel (G), redaktionel (R), teknisk (T)) Kommentar KMS-1 G Godt
Læs mereAnvendelse af metoder - Programmering
Denne guide er oprindeligt udgivet på Eksperten.dk Anvendelse af metoder - Programmering En forhåbentlig rigtig god forklaring på hvad metoder er og hvordan de anvendes. Lidt om private og public, retur
Læs mereLær Python - Dag 4, modul 2 Objektorienteret programmering
Lær Python - Dag 4, modul 2 Objektorienteret programmering Simon J. Larsen 28. oktober 2017 Institut for Matematik og Datalogi Metoder Metoder Indtil videre har vi kun brugt objekter til at gemme værdier.
Læs mereDesign by Contract. Design and Programming by Contract. Oversigt. Prædikater
Design by Contract Design and Programming by Contract Anne Haxthausen ah@imm.dtu.dk Informatics and Mathematical Modelling Technical University of Denmark Design by Contract er en teknik til at specificere
Læs mereSproget Limba. Til brug i G1 og K1. Dat1E 2003
Sproget Limba Til brug i G1 og K1 Dat1E 2003 Abstract Limba er et simpelt imperativt sprog med hoballokerede tupler. Dette dokument beskriver uformelt Limbas syntaks og semantik samt en fortolker for Limba,
Læs mereForelæsning Uge 2 Mandag
Forelæsning Uge 2 Mandag Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Java syntax og style guide Afleveringsopgave:
Læs mereclass Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.
Programmering 1999 Forelæsning 4, fredag 10. september 1999 Klasser og objekter Felter, konstruktorer, this Eksempler på klasser: Time, Appointment Eksempler på metoder i Time og Appointment Klassefelter:
Læs mereDM507 Algoritmer og datastrukturer
DM507 Algoritmer og datastrukturer Forår 2012 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 15. marts, 2012 Dette projekt udleveres i tre dele. Hver del har sin deadline, således
Læs mereObjektorientering. Programkvalitet
1 PROSA-Bladet nr. 4 1993 Objektorientering = Programkvalitet? Af Finn Nordbjerg, adjunkt ved Datamatikeruddannelsen, Aalborg Handelskole 1. Indledning Objektorientering er blevet et edb-fagets mest udbredte
Læs mereDM507 Algoritmer og datastrukturer
DM507 Algoritmer og datastrukturer Forår 2013 Projekt, del I Institut for matematik og datalogi Syddansk Universitet 5. marts, 2013 Dette projekt udleveres i to dele. Hver del har sin deadline, således
Læs mereLektion 6. Grundlæggende programmering i VR
Lektion 6 Grundlæggende programmering i VR Plan for i dag Simpelt FPS Triggerzones og animationer C# og objekt orienteret programmering Interfaces Generics Google Cardboard Video om VRs fremtid App til
Læs mere17 Søgning og Søgetræer.
17 Søgning og Søgetræer. Lineær og inær søgning i lister. inære søgetræer. Søgning efter knude i træ. Indsættelse af knude i træ. Søgning i og sortering af inært søgetræ. Sletning af knude i inært søgetræ.
Læs mereSkriftlig eksamen i Datalogi
Roskilde Universitetscenter Skriftlig eksamen i Datalogi Modul 1 Vinter 1998/99 Opgavesættet består af 5 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 16% Opgave 2 12% Opgave 3 10% Opgave
Læs mereIntroduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer
Introduktion til datastrukturer Introduktion til datastrukturer Philip Bille Datastrukturer Datastruktur. Metode til at organise data så det kan søges i/tilgås/manipuleres effektivt. Mål. Hurtig Kompakt
Læs mere22 Hobe. Noter. PS1 -- Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned.
22 Hobe. Binære hobe. Minimum-hob og maximum-hob. Den abstrakte datatype minimum-hob. Opbygning af hobe. Operationen siv-ned. Indsættelse i hobe. Sletning af minimalt element i hobe. Repræsentation. 327
Læs mereObjektorienteret Programmering
Objektorienteret Programmering Struktureret Systemudvikling Jan Bendtsen Automation and Control Indhold Lidt om programmeringssprog Klasser i Java Klasser i C++ Oversættelse og kørsel af kode Et eksempel:
Læs mere12 Metaobjekt protokoller i CLOS.
12 Metaobjekt protokoller i CLOS. Begreber og problemer. Sprog designrum. Niveauer i CLOS. Programobserverende protokoller. Programskabende protokoller. Sprogudvidende protokoller. Eksempler. Kurt Nørmark,
Læs mere1 KlassifikationStruktur
..27 KlassifikationStruktur. KlassifikationStruktur Klassifikation er det abstrakte objekt som samler et klassifikationssystem. Klassifikation holder klassifikationssystemets metadata. Klassifikationssystemet
Læs mereForelæsning Uge 2 Mandag
Forelæsning Uge 2 Mandag Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Java syntax og style guide Afleveringsopgaver
Læs mereRettelser til Pilen ved træets rod
Rettelser til Pilen ved træets rod Hans Hüttel Pr. 12. juni 2003 Nedenstående rettelser er indsamlet af mig selv, Peter Poulsen, Martin Maach og ikke mindst Lars Schunk i løbet af foråret 2003. Simple
Læs mereOm begrebet relation
Om begrebet relation Henrik Stetkær 11. oktober 2005 Vi vil i denne note diskutere det matematiske begreb en relation, herunder specielt ækvivalensrelationer. 1 Det abstrakte begreb en relation Som ordet
Læs mereDatabasesystemer. Databaser, efterår Troels Andreasen. Efterår 2002
Databaser, efterår 2002 Databasesystemer Troels Andreasen Datalogiafdelingen, hus 42.1 Roskilde Universitetscenter Universitetsvej 1 Postboks 260 4000 Roskilde Telefon: 4674 2000 Fax: 4674 3072 www.dat.ruc.dk
Læs mereb) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.
Exercise 1: Opgave 9.1 på CodeJudge. a) Lav klasserne Cirkel, Rektangel og Kvadrat, som implementerer vedhæftede interface From.java (se CodeJudge). Lav Rektangel før du laver Kvadrat. Kan du bruge nedarvning
Læs mereIntroduktion til datastrukturer. Introduktion til datastrukturer. Introduktion til datastrukturer. Datastrukturer
Introduktion til datastrukturer Introduktion til datastrukturer Philip Bille Datastrukturer Datastruktur. Metode til at organise data så det kan søges i/tilgås/manipuleres effektivt. Mål. Hurtig Kompakt
Læs mereSproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter 2006. Abstract
Sproget Six Til brug i rapportopgaven på kurset Oversættere Vinter 2006 Abstract Six er baseret på det sprog, der vises i figur 6.2 og 6.4 i Basics of Compiler Design. Den herværende tekst beskriver basissproget
Læs mere1 Grundbegreber. Noter. Stilarter i programmering og sprog. Syntaks og semantik. Datatyper. Kontrolstrukturer. Udtryk. Abstraktioner.
1 Grundbegreber. Stilarter i programmering og sprog. Syntaks og semantik. Datatyper. Kontrolstrukturer. Udtryk. Abstraktioner. Parametermekanismer. Blokke og navnebindinger. Scope og scoperegler. 3 Parallelle
Læs mereSkriftlig eksamen i Datalogi
Roskilde Universitetscenter side 1 af 11 sider Skriftlig eksamen i Datalogi Modul 1 Sommer 2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 10% Opgave 2 10%
Læs mereKontraktbaseret Design. Anker Mørk Thomsen
Kontraktbaseret Design Anker Mørk Thomsen 5. marts 2014 -2 Kontraktbaseret Design Anker Mørk Thomsen 1. udgave ISBN: 9788740491500 Forord Bogen er blevet til gennem undervisning i faget Kontraktbaseret
Læs mereSWC eksamens-spørgsmål. Oversigt
SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition
Læs mereForelæsning Uge 2 Mandag
Forelæsning Uge 2 Mandag Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Java syntax og style guide Afleveringsopgaver
Læs mereNoter til C# Programmering Iteration
Noter til C# Programmering Iteration Programflow Programmer udfører det meste af deres arbejde vha. forgrening og løkker. Løkker Mange programmeringsproblemer kan løses ved at gentage en handling på de
Læs mereProgrammeringscamp. Implementer funktionerne én for én og test hele tiden.
Programmeringscamp De to opgaver træner begge i at lave moduler som tilbyder services der kan bruges af andre, samt i at implementere services efter en abstrakt forskrift. Opgave 1 beder jer om at implementere
Læs mereForelæsning Uge 11. Nedarvning. Object klassen. Projektopgave om computerspil
Forelæsning Uge 11 Nedarvning En klasse kan være en subklasse af en anden Det betyder at subklassen arver superklassens feltvariabler og metoder Object klassen Superklasse for alle klasser Indeholder en
Læs mereIntroduktion til datastrukturer
Introduktion til datastrukturer Datastrukturer Stakke og køer Hægtede lister Dynamiske tabeller Philip Bille Introduktion til datastrukturer Datastrukturer Stakke og køer Hægtede lister Dynamiske tabeller
Læs mereDM507 Algoritmer og datastrukturer
DM507 Algoritmer og datastrukturer Forår 2018 Projekt, del II Institut for matematik og datalogi Syddansk Universitet 13. marts, 2018 Dette projekt udleveres i tre dele. Hver del har sin deadline, således
Læs mereKapitel 3 Betinget logik i C#
Kapitel 3 i C# er udelukkende et spørgsmål om ordet IF. Det er faktisk umuligt at programmere effektivt uden at gøre brug af IF. Du kan skrive små simple programmer. Men når det bliver mere kompliceret
Læs mere