Download ppt - Programmering i C#

Transcript
Page 1: Programmering i C#

Programmering i C#

3. Klasser

Page 2: Programmering i C#

Programmering i C# - Kapitel 32

3.1 Inkapsling och datagömning

Inkapsling innebär paketering av funktioner och det data de ska hantera Klasser och structer

Datagömning innebär att access till data kan kontrolleras med hjälp av synlighetsmodifierare Fem nivåer: public, private, protected, internal, internal protected

Page 3: Programmering i C#

Programmering i C# - Kapitel 33

3.2 Fält (fields)

Medlemmar kan vara funktioner, variabler eller typer

Åtskilliga varianter i C#: Fält är medlemsvariabler

Klassreferenser, interfacereferenser, structer Görs aldrig public i klasser, men ofta i structer Initieras automatiskt till noll (eller motsv.)

Page 4: Programmering i C#

Programmering i C# - Kapitel 34

Initiering av fält

class Trivial // klassdeklarationen

{int val = 100; // default synlighet: privatestring str = ”Etthundra”;double[] vec = new double[100];MyClass obj1 = new MyClass();YourClass obj2 = null; // endast för tydlighet

// blir ändå nullpublic int GetVal(){

return val;}

}

Page 5: Programmering i C#

Programmering i C# - Kapitel 35

Skrivskyddade fält

Två sätt skrivskydda fält: Initiera med literal – const

Endast typer som kan skrivas literalt Tilldela en gång – readonly

I klassdeklaration eller konstruktor Alla typer, även referenser

Page 6: Programmering i C#

Programmering i C# - Kapitel 36

Skrivskyddade fält, exempel

class Trivial

{const int val = 100;const string str = ”Ständigt innehåll”;readonly SomeClass obj = new SomeClass();public int GetVal(){

return val; // alltid 100}

}

Page 7: Programmering i C#

Programmering i C# - Kapitel 37

Statiska fält

Instansmedlemmar ingår i objekt Statiska medlemmar finns i ett enda

gemensamt exemplar Refereras endast med klassnamn

Konstant medlem blir också statisk!Trivial obj = new Trivial();

... obj.val; // Fel, val är const och därmed static

... Trivial.val; // Rätt!

Page 8: Programmering i C#

Programmering i C# - Kapitel 38

3.3 Konstruktorer

Konstruktor är en metod med samma namn som klassen Skapar objekt av klassen Kan överlagras med olika parameterlistor Ingen deklarerad returtyp

Klass utan konstruktor får en parameterlös defaultkonstruktor automatiskt genererad

Trivial obj = new Trivial(); // defaultkonstruktorn

Page 9: Programmering i C#

Programmering i C# - Kapitel 39

Egna konstruktorer

class Rational {int numerator, denominator;public Rational(): this(0, 1) {}public Rational(int n): this(n, 1) {}public Rational(double val):

this((int)(val * 1000), 1000) {}public Rational(int n, int d)

{if (d == 0) d = 1;numerator = n;denominator = d;

}

}

Page 10: Programmering i C#

Programmering i C# - Kapitel 310

3.4 Metoder (methods)

Definieras alltid med returtyp, namn och parameterlista, samt kropp Parameterlistan kan vara tom Flera metoder med samma namn men olika

parameterlista tillåts (överlagring) Structparameter ger värdeanrop Referensparameter ger referensanrop

Klassobjekt alltid referens

Page 11: Programmering i C#

Programmering i C# - Kapitel 311

Parameteröverföring

static void F(int x, int[] vec)

{x = 100;vec[0] = 100;

}

static void Main()

{int i = 0;int[] iv = new int[3]; // alla är 0F(i, iv);Console.WriteLine(”{0}, {1}”, i, iv[0]); // ”0, 100”

}

Page 12: Programmering i C#

Programmering i C# - Kapitel 312

Referensanrop med struct

Referensanrop med struct fås med modifierarna ref eller out Anges både i definition och i anrop

Liten skillnad: out kan vara oinitierad

static void F(ref int x, int[] vec)

{ … // gör något med x }

static void Main()

{ … F(ref i, iv); } // i kan ändras av anropet

Page 13: Programmering i C#

Programmering i C# - Kapitel 313

Statiska metoder

Även metoder kan vara static Anropas via klassnamn Kan endast se andra statiska medlemmar

Även const är statiska! Instansmetoder har osynlig parameter this Refererens till det aktuella objektet

Statiska metoder har ingen this

Page 14: Programmering i C#

Programmering i C# - Kapitel 314

3.5 Egenskaper (properties)

Ser ut som fält men är metoder Kan dölja ett fält som annars kunde

vara public Gör aldrig fält public!

Kan ha valfri logik, som en metod Kan ha set och/eller get

Bara get ger skrivskydd

Page 15: Programmering i C#

Programmering i C# - Kapitel 315

Egenskaper exempel

public string MyProp

{get{

return myField;}set{

myField = value;}

}

obj.MyProp = ”Ny sträng”;

Page 16: Programmering i C#

Programmering i C# - Kapitel 316

Statisk egenskap som konstruktor

Vanlig design i många klasser: Statiska egenskaper som returnerar

typiska objekt Anropar någon konstruktor

public static Color Red

{get { return new Color(255, 0, 0); }

}

Color obj = Color.Red;

Page 17: Programmering i C#

Programmering i C# - Kapitel 317

3.6 Operatorer

Alla operatorer är metoder i respektive klass eller struct

Valfritt förse egna typer med operatorer Operatorer är statiska metoder där minst

en parameter (operand) är av aktuell typ En operand: en parameter Två operander: två parametrar

Page 18: Programmering i C#

Programmering i C# - Kapitel 318

Operatorer forts.

Endast operatorer från standarduppsättning Nya kan inte uppfinnas

Prioritet och associativitet enligt reglerna Unär/binär såsom operatorn Tilldelningsoperatorn kan inte överlagras

public static X operator+(X left, X right)

{ … }

Page 19: Programmering i C#

Programmering i C# - Kapitel 319

Operator ++ och --

Ensam om egenheten att vara prefix eller postfix

Kan inte överlagras specifikt för ++x/x++ Måste returnera objekt av aktuell typ Får ej ändra aktuellt objekts tillstånd

Page 20: Programmering i C#

Programmering i C# - Kapitel 320

Indexoperatorn

Vanligt behov är att kunna överlagra specifikt för lvalue/rvalue Problematiskt i exempelvis C++

C# har valt annan syntax (”indexerare”)public X this[int i]

{

get { … }

set { … }

}

Page 21: Programmering i C#

Programmering i C# - Kapitel 321

Specialfall

Kombinationerna överlagras inte explicit +=, *=, <<=, etc. Operatorn anropas, därefter tilldelning

&& och || överlagras med särskild syntax Mycket litet behov

Ytterligare några kan ej överlagras: is, as, typeof, new, . och ?:

Page 22: Programmering i C#

Programmering i C# - Kapitel 322

3.7 Typomvandlare

Implicit och explicit typomvandling är också egentligen metoder i klasser/structer Undantaget upcast/downcast

Egna typer kan göras kompatibla med andra genom typomvandlare

Syntax som liknar operatorer

Page 23: Programmering i C#

Programmering i C# - Kapitel 323

Typomvandlare exempel

Typomvandlaren måste markeras implicit eller explicit

class Rational

{private int numerator, denominator;...public static implicit operator double(Rational obj){

return (double)obj.numerator/obj.denominator;}

}

Page 24: Programmering i C#

Programmering i C# - Kapitel 324

Typomvandlare forts.

Omvandling till egen typ också relevant Exempelvis double till Rational

Blir parallell till konstruktor Anropar typiskt motsvarande

enparameterskonstruktor

Page 25: Programmering i C#

Programmering i C# - Kapitel 325

3.8 Destruktor

Skräpsamlaren raderar objekt vid odefinierad tidpunkt

Objekt från klasser med destruktor hanteras i särskild kö

Få klasser har behov av destruktor – i de fallen måste den kunna anropas explicit Men explicit konstruktoranrop finns inte!

Page 26: Programmering i C#

Programmering i C# - Kapitel 326

Dispose-mönstret

Resursallokerande klasser ska ha destruktor och implementera IDisposable.Dispose Anrop till Dispose bör eliminera skräpsamlarens

anrop till destruktor Efter anrop till Dispose bör objektet vara

oanvändbart Dispose ska klara upprepade anrop Destruktor och Dispose ska inte dubblera varann

Page 27: Programmering i C#

Programmering i C# - Kapitel 327

Dispose-mönstret forts.

class X : IDisposable {private bool disposed = false;

~X() { Dispose(false); }

public void Dispose() { Dispose(true); }

private void Dispose(bool disposing) {if (Disposed) return;

// API-anrop som släpper resurser

if (disposing) {

disposed = true;

GC.SuppressFinalize(this); }

}

}


Recommended