Skillnad mellan versioner av "Kap 1 Objektorienterad programmering (forts.)"

Från Mathonline
Hoppa till: navigering, sök
(Skapade sidan med '__NOTOC__ {| border="0" cellspacing="0" cellpadding="0" height="30" width="100%" | style="border-bottom:1px solid #797979" width="5px" |   {{Not selected tab|Lektion 2...')
 
m
 
(20 mellanliggande versioner av samma användare visas inte)
Rad 3: Rad 3:
 
| style="border-bottom:1px solid #797979" width="5px" |  
 
| style="border-bottom:1px solid #797979" width="5px" |  
 
{{Not selected tab|[[Lektion 2 (OOP)| <<&nbsp;&nbsp;Agenda]]}}
 
{{Not selected tab|[[Lektion 2 (OOP)| <<&nbsp;&nbsp;Agenda]]}}
{{Not selected tab|[[Media: Innehall_OOP_design.pdf|Innehåll & struktur]]}}
+
{{Not selected tab|[[Innehåll och struktur av kursen OOP & design|Innehåll & struktur]]}}
 
{{Selected tab|[[Kap 1 Objektorienterad programmering (forts.)|Genomgång]]}}
 
{{Selected tab|[[Kap 1 Objektorienterad programmering (forts.)|Genomgång]]}}
 
{{Not selected tab|[[Övningar 2 (OOP)|Dagens övningar]]}}
 
{{Not selected tab|[[Övningar 2 (OOP)|Dagens övningar]]}}
Rad 12: Rad 12:
 
<br>
 
<br>
  
= <b><span style="color:#931136">1.1 &nbsp; Vad är objektorienterad programmering?</span></b> =
+
= <b><span style="color:#931136">1.4 &nbsp; Användning av klasser</span></b> =
 +
<div class="ovnC">
 +
 
 +
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Anv_Klasser.jpg]]</div>
 +
</div>
 +
 
 +
 
 +
= <b><span style="color:#931136">1. Deklaration av en klass</span></b> =
 
<div class="ovnE">
 
<div class="ovnE">
<big><big>
+
=== <b><span style="color:#931136">Klassen Emp</span></b> ===
:Gå igenom texten (PDF 7 sidor)<span>:</span>
+
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Emp.jpg]]</div>
<math> \qquad\;\;\, </math><div class="smallBox">[[Media: Vad_OOP.pdf|<b><span style="color:blue">Vad är objektorienterad programmering?</span></b>]]</div><math> \qquad\;\;\, </math>
+
</big></big>
+
 
</div>
 
</div>
  
  
= <b><span style="color:#931136">1.2 &nbsp; Klassbegreppet</span></b> =
+
= <b><span style="color:#931136">2. Definition av ett objekt</span></b> =
 +
= <b><span style="color:#931136">3. Åtkomst till objektets medlemmar</span></b> =
 
<div class="ovnC">
 
<div class="ovnC">
=== <b><span style="color:#931136">En klass som ett C# program</span></b> ===
+
=== <b><span style="color:#931136">Programmet EmpTest</span></b> ===
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Firsta.jpg]]</div>
+
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Emp_Test.jpg]]</div>
  
  
<big><big>Varför står metoden <b><span style="color:red">Main()</span></b> i en <b><span style="color:red">klass</span></b>, nämligen <b><span style="color:blue">class First</span></b> &nbsp;?
+
=== <b><span style="color:#931136">Ett körexempel</span></b> ===
 +
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: EmpTestKorex.jpg]]</div>
 +
</div>
  
Eftersom koden ska vara ett <b><span style="color:red">C# program</span></b>, nämligen:
 
  
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: CsPrograma.jpg]]</div>
+
= <b><span style="color:#931136">1.5 &nbsp; Klassens konstruktor</span></b> =
 +
<div class="ovnC">
 +
=== <b><span style="color:#931136">Inkapsling och dess problematik</span></b> ===
 +
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Inkapslinga.jpg]]</div>
  
Koden ovan (<b><span style="color:blue">class First</span></b>) är det det enklast tänkbara <b><span style="color:red">C# programmet</span></b>.
+
<big><b><span style="color:red">Problem:</span></b>
  
Metoden <b><span style="color:red">Main()</span></b> kan inte skrivas utanför klassen.
+
Hur ska privata datamedlemmar <b><span style="color:red">initieras</span></b> när de är oåtkomliga?
</big></big>
+
</div>
+
  
 +
<b><span style="color:red">Lösningen:</span></b>
  
= <b><span style="color:#931136">Definition 1 av klass</span></b> =
+
Man använder publika metoder för att via dem komma åt klassens privata datamedlemmar.
<div class="ovnE">
+
  
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: VadKlass.jpg]]</div>
+
En av dessa metoder är <b>klassens konstruktor</b>.
 +
 +
</big>
 +
</div>
  
  
<big><big><b><span style="color:red">Generell</span></b> är en klass därför att den beskriver en <b>kategori</b> av saker och ting:
+
= <b><span style="color:#931136">Vad är konstruktorn?</span></b> =
 +
<div class="border-divblue">
 +
<big>
 +
<b>Konstruktorn</b> är en speciell [[Kap_1_Objektorienterad_programmering_(forts.)#Konstruktorns_tre_egenskaper|<b><span style="color:#931136">metod med tre egenskaper</span></b>]] vars uppgift är att initiera klassens privata datamedlemmar.
  
* &nbsp; &nbsp; ett <b>begrepp</b>
+
Konstruktorn finns by default i alla klasser, men kan även skrivas i klassen. Se exemplet nedan.
 +
</big>
 +
</div>
  
* &nbsp; &nbsp; en <b>idé</b>
 
  
* &nbsp; &nbsp; en <b>mall</b>.  
+
= <b><span style="color:#931136">Exempel: Klassen Circle</span></b> =
 +
<div class="ovnE">
 +
[[Image: CircleKonstr.jpg]]
 +
</div>
  
Enligt klassens mall kan sedan <b>objekt</b> av denna klass skapas. Medan klassen
 
  
är abstrakt, är objekten verkliga eller virtuella saker och ting i den reala världen.
+
= <b><span style="color:#931136">Åtkomstmodifieraren private</span></b> =
 +
<div class="ovnC">
 +
=== <b><span style="color:#931136">Programmet Encapsulation</span></b> ===
 +
[[Image: Encapsulation.jpg]]
  
<b><span style="color:red">Modulär</span></b> är en klass därför att den kodas som en separat och namngiven modul
 
  
så att den kan användas av vilka andra program som helst. Liksom en Legobit
+
<big>Klassen Circle:s datamedlem <b><span style="color:red">radius</span></b> är oåtkomlig här pga åtkomstmodifieraren <b><span style="color:red">private</span></b>.  
  
för att kunna konstruera andra program. Principen heter <b>modularisering</b>.
+
Men vi kan initiera den med <b><span style="color:red">input</span></b> via den publika metoden <b><span style="color:red">Circle()</span></b> dvs klassens konstruktor.
 +
</big>
 +
=== <b><span style="color:#931136">Ett körexempel</span></b> ===
 +
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: CircleKorexa.jpg]]</div>
 +
</div>
  
<b><span style="color:red">Klass och objekt är två olika begrepp.</span></b>
 
  
<b>Exempel:</b>
+
= <b><span style="color:#931136">Konstruktorns tre egenskaper</span></b> =
 +
<div class="border-divblue">
 +
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: KonstrEgenskapera.jpg]]</div>
 +
</div>
 +
 
 +
 
 +
= <b><span style="color:#931136">Default konstruktorn</span></b> =
 +
<div class="border-divblue">
 +
<big><big>
 +
Alla klasser i C# har automatiskt en <b>default konstruktor</b> som
  
Pepparkakor är <b><span style="color:red">objekt.</span></b>
+
initierar klassens datamedlemmar till <b>default värden</b>.
  
Pepparkaksformen är <b><span style="color:red">klassen.</span></b>
+
Default konstruktorn sätts ur funktion endast om man definierar en egen konstruktor.
 
</big></big>
 
</big></big>
 
</div>
 
</div>
  
  
= <b><span style="color:#931136">Definition 2 av klass</span></b> =
+
= <b><span style="color:#931136">Klassen CircleD med default konstruktor</span></b> =
<div class="ovnA">
+
<div class="ovnE">
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Def_2_klass.jpg]]</div>
+
[[Image: CircleD.jpg]]
  
  
<big><big>Ett begrepp kan ha olika definitioner om de inte motsäger varandra och belyser olika
+
<big><b><span style="color:red">class</span></b> skapar automatiskt en <b><span style="color:red">default konstruktor</span></b> som inte har någon parameter: <b><span style="color:red">class()</span></b>.
  
aspekter av begreppet. Sammanhanget i vilket begreppet används avgör betydelsen.</big></big>
+
Default konstruktorn initierar klassens datamedlemmar till <b><span style="color:red">defaultvärden</span></b>.
</div>
+
  
 +
Defaultvärdena är beroende av medlemmarnns datatyper: Taltypernas defaultvärde är <b><span style="color:red">0</span></b>.
  
= <b><span style="color:#931136">1.3 &nbsp; Modulariseringsprocessen</span></b> =
+
String:s defaultvärde är <b><span style="color:red">" "</span></b>. Referensernas defaultvärde är <b><span style="color:red">null</span></b> osv.
<div class="ovnE">
+
</big>
=== <b><span style="color:#931136">Utan modularisering: all kod i Main()</span></b> ===
+
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: All_in_Main.jpg]]</div>
+
 
</div>
 
</div>
  
  
= <b><span style="color:#931136">Modularisering på metodnivå</span></b> =
+
= <b><span style="color:#931136">Programmet EncapsulationD</span></b> =
<div class="ovnC">
+
<div class="ovnE">
<big><big>
+
[[Image: EncapsulationD.jpg]]
Modulariseringens <b>1:a steg: <span style="color:red">Logiken</span></b> flyttas till en <b><span style="color:red">ny metod Ok()</span></b> utanför Main().
+
</big></big>
+
  
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Method_Module.jpg]]</div>
 
  
 +
<big>Klassen CircleD:s datamedlem <b><span style="color:red">radius</span></b> är fortfarande oåtkomlig här pga <b><span style="color:red">private</span></b>.
  
<big><big>Klassen <b>Method</b> har två metoder: <b>Main()</b> och <b>Ok()</b>: Main() anropar Ok(). Vid anrop:
+
Alla objekt måste skapas genom att anropa en <b><span style="color:red">konstruktor</span></b> vare sig default eller egendefinierad.
 +
</big>
 +
</div>
  
skickas den aktuella parametern input till den formella parametern passwd och retur-
 
  
värdet av typ <b>bool</b> returneras via Ok() till Main() och används i if-satsens samt loopens villkor.
+
= <b><span style="color:#931136">Ett körexempel</span></b> =
</big></big>
+
<div class="ovnE">
 +
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Gando.jpg]]</div>
 
</div>
 
</div>
  
  
= <b><span style="color:#931136">Modularisering på klassnivå</span></b> =
+
= <b><span style="color:#931136">Flera konstruktorer: Klassen Account</span></b> =
<div class="ovnA">
+
<div class="ovnC">
<big><big>
+
[[Image: Account.jpg]]
Modulariseringens <b>2:a steg:</b> Metoden Ok() flyttas till en annan klass = <b>ny datatyp</b>.
+
  
I Main() skapas ett <b><span style="color:red">objekt</span></b> av den nya datatypen Password och
 
  
<b><span style="color:red">objektets metod</span></b> Ok() anropas i Main().
+
<big>Datamedlemmarna har ingen explicit åtkomstmodifierare, varken private eller public.  
</big></big>
+
  
=== <b><span style="color:#931136">Klassen Password</span></b> ===
+
Men de är ändå <b><span style="color:red">private</span></b> by default pga klassens inkapslingsegenskap.
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: Password.jpg]]</div>
+
  
 +
De kan initieras endast via de publika konstruktorerna när ett objekt skapas.
 +
</big>
 +
</div>
  
<big><big>
 
Klasserna <b><span style="color:#931136">Password</span></b> och <b><span style="color:#931136">PasswordUse</span></b> utgör ETT <b><span style="color:red">objektorienterat</span></b> program.
 
</big></big>
 
  
=== <b><span style="color:#931136">Klassen PasswordUse</span></b> ===
+
= <b><span style="color:#931136">Programmet CreateAccount</span></b> =
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: PasswordUse.jpg]]</div>
+
<div class="ovnC">
 +
[[Image: CreateAccount.jpg]]
  
  
=== <b><span style="color:#931136">Ett körexempel</span></b> ===
+
<big>"Ompekning" därför att samma referens <b><span style="color:red">myAccount</span></b> används för att peka på det andra objektet.
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: PasswordUseKorexa.jpg]]</div>
+
 
 +
S.k. <i>Garbage collector</i> rensar automatiskt det första, numera orefererade objektets minnesutrymme.
 +
 
 +
Ompekning motsvarar överskrivning av variablers värden hos variabler av enkel datatyp.
 +
</big>
 
</div>
 
</div>
  
 +
 +
= <b><span style="color:#931136">Ett körexempel</span></b> =
 +
<div class="ovnC">
 +
<div style="border:1px solid black;display:inline-table;margin-left: 0px;"> [[Image: KorexFlera.jpg]]</div>
 +
</div>
  
  

Nuvarande version från 24 november 2022 kl. 20.02

        <<  Agenda          Innehåll & struktur          Genomgång          Dagens övningar          Nästa lektion  >>      


1.4   Användning av klasser

Anv Klasser.jpg


1. Deklaration av en klass

Klassen Emp

Emp.jpg


2. Definition av ett objekt

3. Åtkomst till objektets medlemmar

Programmet EmpTest

Emp Test.jpg


Ett körexempel

EmpTestKorex.jpg


1.5   Klassens konstruktor

Inkapsling och dess problematik

Inkapslinga.jpg

Problem:

Hur ska privata datamedlemmar initieras när de är oåtkomliga?

Lösningen:

Man använder publika metoder för att via dem komma åt klassens privata datamedlemmar.

En av dessa metoder är klassens konstruktor.


Vad är konstruktorn?

Konstruktorn är en speciell metod med tre egenskaper vars uppgift är att initiera klassens privata datamedlemmar.

Konstruktorn finns by default i alla klasser, men kan även skrivas i klassen. Se exemplet nedan.


Exempel: Klassen Circle


Åtkomstmodifieraren private

Programmet Encapsulation

Encapsulation.jpg


Klassen Circle:s datamedlem radius är oåtkomlig här pga åtkomstmodifieraren private.

Men vi kan initiera den med input via den publika metoden Circle() dvs klassens konstruktor.

Ett körexempel

CircleKorexa.jpg


Konstruktorns tre egenskaper

KonstrEgenskapera.jpg


Default konstruktorn

Alla klasser i C# har automatiskt en default konstruktor som

initierar klassens datamedlemmar till default värden.

Default konstruktorn sätts ur funktion endast om man definierar en egen konstruktor.


Klassen CircleD med default konstruktor

CircleD.jpg


class skapar automatiskt en default konstruktor som inte har någon parameter: class().

Default konstruktorn initierar klassens datamedlemmar till defaultvärden.

Defaultvärdena är beroende av medlemmarnns datatyper: Taltypernas defaultvärde är 0.

String:s defaultvärde är " ". Referensernas defaultvärde är null osv.


Programmet EncapsulationD

EncapsulationD.jpg


Klassen CircleD:s datamedlem radius är fortfarande oåtkomlig här pga private.

Alla objekt måste skapas genom att anropa en konstruktor vare sig default eller egendefinierad.


Ett körexempel

Gando.jpg


Flera konstruktorer: Klassen Account

Account.jpg


Datamedlemmarna har ingen explicit åtkomstmodifierare, varken private eller public.

Men de är ändå private by default pga klassens inkapslingsegenskap.

De kan initieras endast via de publika konstruktorerna när ett objekt skapas.


Programmet CreateAccount

CreateAccount.jpg


"Ompekning" därför att samma referens myAccount används för att peka på det andra objektet.

S.k. Garbage collector rensar automatiskt det första, numera orefererade objektets minnesutrymme.

Ompekning motsvarar överskrivning av variablers värden hos variabler av enkel datatyp.


Ett körexempel

KorexFlera.jpg










Copyright © 2022 TechPages AB. All Rights Reserved.