1 / 27

Programmering i C#

Programmering i C#. 3. Klasser. 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

shiri
Télécharger la présentation

Programmering i C#

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Programmering i C# 3. Klasser

  2. 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 Programmering i C# - Kapitel 3

  3. 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.) Programmering i C# - Kapitel 3

  4. Initiering av fält class Trivial // klassdeklarationen {int val = 100; // default synlighet: privatestring str = ”Etthundra”;double[] vec = newdouble[100];MyClass obj1 = new MyClass();YourClass obj2 = null; // endast för tydlighet // blir ändå nullpublicint GetVal(){return val;} } Programmering i C# - Kapitel 3

  5. 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 Programmering i C# - Kapitel 3

  6. Skrivskyddade fält, exempel class Trivial {constint val = 100;conststring str = ”Ständigt innehåll”;readonly SomeClass obj = new SomeClass();publicint GetVal(){return val; // alltid 100} } Programmering i C# - Kapitel 3

  7. 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! Programmering i C# - Kapitel 3

  8. 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 Programmering i C# - Kapitel 3

  9. 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;} } Programmering i C# - Kapitel 3

  10. 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 Programmering i C# - Kapitel 3

  11. Parameteröverföring staticvoid F(int x, int[] vec) {x = 100;vec[0] = 100; } staticvoid Main() {int i = 0;int[] iv = newint[3]; // alla är 0F(i, iv);Console.WriteLine(”{0}, {1}”, i, iv[0]); // ”0, 100” } Programmering i C# - Kapitel 3

  12. 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 staticvoid F(ref int x, int[] vec) { … // gör något med x } staticvoid Main() { … F(ref i, iv); } // i kan ändras av anropet Programmering i C# - Kapitel 3

  13. 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 Programmering i C# - Kapitel 3

  14. 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 Programmering i C# - Kapitel 3

  15. Egenskaper exempel publicstring MyProp {get{return myField;}set{ myField = value;} } obj.MyProp = ”Ny sträng”; Programmering i C# - Kapitel 3

  16. Statisk egenskap som konstruktor • Vanlig design i många klasser: • Statiska egenskaper som returnerar typiska objekt • Anropar någon konstruktor publicstatic Color Red {get { return new Color(255, 0, 0); } } Color obj = Color.Red; Programmering i C# - Kapitel 3

  17. 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 Programmering i C# - Kapitel 3

  18. 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 publicstatic X operator+(X left, X right) { … } Programmering i C# - Kapitel 3

  19. 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 Programmering i C# - Kapitel 3

  20. 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 { … } } Programmering i C# - Kapitel 3

  21. 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 ?: Programmering i C# - Kapitel 3

  22. 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 Programmering i C# - Kapitel 3

  23. Typomvandlare exempel class Rational {privateint numerator, denominator;...publicstaticimplicitoperatordouble(Rational obj){return (double)obj.numerator/obj.denominator;} } • Typomvandlaren måste markeras implicit eller explicit Programmering i C# - Kapitel 3

  24. Typomvandlare forts. • Omvandling till egen typ också relevant • Exempelvis double till Rational • Blir parallell till konstruktor • Anropar typiskt motsvarande enparameterskonstruktor Programmering i C# - Kapitel 3

  25. 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! Programmering i C# - Kapitel 3

  26. 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 Programmering i C# - Kapitel 3

  27. Dispose-mönstret forts. class X : IDisposable {privatebool disposed = false; ~X() { Dispose(false); } publicvoid Dispose() { Dispose(true); } private void Dispose(bool disposing) {if (Disposed) return; // API-anrop som släpper resurser if (disposing) { disposed = true; GC.SuppressFinalize(this); } } } Programmering i C# - Kapitel 3

More Related