Curs2-POO

1,464 views
1,395 views

Published on

Published in: Education, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,464
On SlideShare
0
From Embeds
0
Number of Embeds
18
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Curs2-POO

  1. 1. Programarea orientată pe obiecte Curs 2
  2. 2. Clase şi obiecte <ul>Aceasta prezentare (si cele ce vor urma) are la baza cartea Ioan Jurca – Programarea Orientata pe Obiecte cat si diferite materiale “culese” din Internet. Peste tot unde am folosit diferite surse am incercat sa mentionez autorii acestora. Eventualele scapari sunt mea culpa . </ul>
  3. 3. Clase şi obiecte <ul><li>Elementele componente ale unei clase
  4. 4. Modificatori
  5. 5. Crearea obiectelor
  6. 6. Supraîncărcarea metodelor
  7. 7. Metoda main
  8. 8. Tablouri
  9. 9. Enumerări
  10. 10. Clase înfăşurătoare
  11. 11. Clase şi metode generice </li></ul>
  12. 12. Clase şi obiecte (2) <ul><li>Clasa – unitatea fundamentală de structurare a programelor orientate pe obiecte;
  13. 13. Clasa este tiparul care defineşte variabilele de stare ale unui obiect şi
  14. 14. operaţiile permise asupra obiectului
  15. 15. În C#: variabile de stare = câmpuri , operaţii = metode
  16. 16. Câmpurile, metodele şi sema n tica lor = contractul clasei
  17. 17. Reprezentarea câmpurilor şi implementarea (codul) metodelor se pot modifica ,
  18. 18. dacă nu afectează contractul ( open/close principle )
  19. 19. Este recomandabil ca numai unele dintre metode (de regulă nu şi câmpurile )
  20. 20. să fie vizibile utilizatorilor  Trebuie şi un mecanism de control al vizibilităţii
  21. 21. elementelor
  22. 22. Alt mecanism: crearea de obiecte (în C#: operatorul new aplicat pe un
  23. 23. constructor al clasei) </li></ul>
  24. 24. Elementele componente ale unei clase Cazul general: 1) câmpuri; 2) metode; 3) clase şi interfeţe încuibate Oricare dintre elemente pot lipsi class Persoana { public String CNP; // cod numeric personal public String nume; // numele persoanei public Persoana pereche; // sotul/sotiei public static long populatie = 0; public Persoana( String nume, String CNP, Persoana peer) { this .nume = nume; this .CNP = CNP; pereche = peer; //!!! populatie++; } public String getNume() { return nume; } public bool checkCNP() { return true ; // nu e obligatoriu sa fie true :) } }
  25. 25. Campuri Variabile de exemplar şi variabile de clasă Iniţializatori : constante sau expresii de tip corespunzător cu al câmpului, stabilesc valoarea iniţială Exemple: double sapte = 3.5 * 2; // expresie constanta double altSapte = sapte; // expresie cu alt camp al obiectului double sin45 = Math.sin(Math.PI/4); // apel de metoda double expr = sapte + Math.sqrt(sin45); //expresie combinata Tipuri predefinite Tipuri predefinite non-obiecte : numerice, char, boolean Tipuri numerice: Byte, short, int, long, float, double Char :reprezentare Unicode câmpuri constante : declarate cu final câmpurile cu tip clasă conţin referinţe !!
  26. 26. Metode (1) <ul><li>Declararea metodelor: antet şi corp
  27. 27. Antet: modificatori , tipul val. returnate , semnătura ;
  28. 28. Semnătura : nume + lista de parametri
  29. 29. Corpul : instrucţiuni între acolade </li></ul>class Persoana { //declaratii de campuri, variabile si initializari public String ToString() { String reprez = &quot;Persoana &quot; + nume + &quot; are codul numeric personal &quot; + CNP + &quot; si &quot; ; if (pereche == null ) reprez += &quot;nu &quot; ; return reprez + &quot; este casatorita.&quot; ; } public static void main( String [] args) { Persoana pers = new Persoana (); pers.CNP = &quot;1760223364760&quot; ; pers.nume = &quot;Ion Ionescu&quot; ; Console .WriteLine(pers.ToString()); } }
  30. 30. Metode (2) <ul><li>Execuţia unui program începe în metoda main
  31. 31. S-a folosit un constructor no-arg , Persoana()
  32. 32. Metodele pot fi: de exemplar (ex. ToString ) sau de clasă / statice (ex. main )
  33. 33. Metodele statice au acces numai la câmpurile statice ! </li></ul>class Persoana { //declaratii de campuri, variabile si initializari public String ToString() { String reprez = &quot;Persoana &quot; + nume + &quot; are codul numeric personal &quot; + CNP + &quot; si &quot; ; if (pereche == null ) reprez += &quot;nu &quot; ; return reprez + &quot; este casatorita.&quot; ; } public static void Main( String [] args) { Persoana pers = new Persoana (); pers.CNP = &quot;1760223364760&quot; ; pers.nume = &quot;Ion Ionescu&quot; ; Console .WriteLine(pers.ToString()); } }
  34. 34. Metode (3) Execuţia metodelor : <ul><li>Fluxul de control trece la metoda apelată;
  35. 35. Se execută metoda până când: </li><ul><li>Ajunge la return
  36. 36. Ajunge la sfârşitul corpului metodei }
  37. 37. Generează o excepţie </li></ul><li>Dacă o metodă nu returnează rezultat : tipul valorii ret. e void
  38. 38. Pentru mai mult de un rezultat : câmpuri în obiect indicat de referinta returnată, tablou; </li></ul><ul><li>În C# toţi parametri se transmit prin valoare !!!
  39. 39. În metode se lucrează cu copii ale parametrilor .
  40. 40. Valorile din metoda apelantă ( param. actuali ) nu sunt afectate
  41. 41. Efecte diferite pt. valori elementare şi pentru referinţe : </li><ul><li>prin referinţe se pot modifica atribute (câmpuri) ale obiectului referit;
  42. 42. modif. referinţei nu are efect în apelant </li></ul></ul>
  43. 43. Metode (4) In cazul valorilor elementare: class ValElem { public static void main( String [] args) { double a = 2.3, b = 4.5; Console .WriteLine( &quot; a initial = &quot; + a); suma(a, b); Console .WriteLine( &quot; a final = &quot; + a); } public static void suma( double x, double y) { x = x + y; Console .WriteLine( &quot;arg 1 in metoda = &quot; +x); } } In cazul referintelor: class ValRef { public static void main( String [] args) { Persoana pers = new Persoana (); pers.CNP = &quot;2780609364760&quot; ; pers.nume = &quot;Maria Ionescu&quot; ; Console .WriteLine( &quot;Nume initial: &quot; + pers.nume); casatorie(pers); Console .WriteLine( &quot;Nume final: &quot; + pers.nume); } public static void casatorie( Persoana refp) { refp.nume = &quot;Maria Popescu&quot; ; refp = null ; } }
  44. 44. Metode (5) casatorie() main() Maria IONESCU casatorie() main() Maria IONESCU before after ? OBIECT cnp, nume, pereche pers refp OBIECT cnp, nume, pereche pers refp
  45. 45. Metode (6) Tra n smiterea prin referinta: <ul><li>metoda apelat ă prim. o referinţă la val. originala
  46. 46. În C# param. obiecte nu se transm. prin ref., se transm. prin valoare referintei la obiecte .
  47. 47. Param. decl. final nu se pot modif. în codul metodei.
  48. 48. metode cu nr. variabil de param. : ultimul param. specif. dă tipul argum. nespecificate </li></ul>public void IntParams( string Message, params int [] p) { Console .WriteLine(Message); for ( int i = 0; i < p.Length; i++) { Console .WriteLine(p[i]); } }
  49. 49. Modificatori Modificatori de acces Stabilesc reguli de vizibilitate pt. clase (în program), câmpuri şi metode (în clase) <ul><li>La clase: </li><ul><li>public – clasa este vizibila in tot programul;
  50. 50. Nesepecificat - clasa este vizibila in tot namespace-ul curent; </li></ul></ul>Obs: La clasele incuibate modificatorii sunt membrii ai clasei incuibate; <ul><li>La campuri </li><ul><li>private – accesibil numai in metodele clasei;
  51. 51. protected – accesibil in metodele clasei curente si acelor drivate din ea si in namespace-ul curent;
  52. 52. public – accesibil oriunde este acesibila clasa;
  53. 53. Fara modificator – la nivel de namespace; </li></ul><li>La metode: similar cu campurile
  54. 54. Atentie: modificatorii de acces actioneaza la nivel de clasa si nu de obiect; </li></ul>
  55. 55. Modificatori Alti modificatori <ul><li>Modific. pt. clase: </li><ul><li>abstract : def. incompletă (cel puţin o met. abstractă). Nu se pot crea obiecte
  56. 56. final : nu poate avea subclase (important pt. securitate) </li></ul><li>La campuri </li><ul><li>transient : există numai în mem., nu pe sup. extern
  57. 57. volatile : se poate modifica oricând, nu se fol. val. din registre </li></ul><li>La metode: </li><ul><li>abstract : nu are definit corpul. Ex.: public abstract void oMetoda();
  58. 58. s ynchronized : nu poate fi executat ă simultan în două fire de execuţie </li></ul></ul>
  59. 59. Crearea obiectelor Constructori Se aplică operatorul new pe un constructor al clasei <ul><li>Tratarea lui new: </li><ul><li>din def. clasei se det. spaţiul de mem. necesar şi se rezervă în zona gest. de maş. virtuală MSIL;
  60. 60. Dacă este spaţiu, se exec. constr., după iniţializarea implicită
  61. 61. Dacă nu este sp.: se gen. exc. OutOfMemoryError şi se termină exec. programului </li></ul><li>Constructorii : iniţializează obiecte , după iniţializarea implicită </li><ul><li>Pot fi oricâţi într-o clasă, au acelaşi nume ca şi clasa, nu ret. valoare, se deoseb. prin param.
  62. 62. Motivaţii: </li><ul><li>Clase cu iniţializ. Incompleta
  63. 63. Restricţii la crearea obiectelor, prin. constr. Ne-publici </li></ul></ul><li>Blocuri de iniţ.: instr. între acolade, în afara constr. sau metode. Se exec. inaintea constr. </li></ul>
  64. 64. Crearea obiectelor Constructori (2) class Complex { private float pReal = 0; private float pImag = 0; public Complex( float pReal) { this. pReal = pReal ; } public Complex( float pReal , float pImag) { this. pReal = pReal; this. pImag = pImag; } //.....
  65. 65. Supraincarcarea metodelor <ul><li>Metode cu acelaşi nume , dar semnături diferite – metode supraîncărcate (overloaded)
  66. 66. Trebuie să difere prin numărul şi/sau tipul parametrilor si ordinea parametrilor
  67. 67. La apelul unei metode (în codul sursă) compil. determină cea mai bună corespondenţă pt. a selecta metoda
  68. 68. Obs : tipul val. ret. nu e parte din semnătură => metodele nu se pot deosebi numai prin valoarea returnată </li></ul>
  69. 69. Metoda main Lansarea în exec. a unui program C# <ul><li>Sup. de exec. localiz. fiş. cu numele numeProgram.exe şi metoda main în fişier; exec. începe cu main
  70. 70. main este obligatoriu public, static şi nu ret. valoare
  71. 71. main are un arg. tablou String, numit args
  72. 72. Nu orice clasă trebuie să aibă main
  73. 73. Suportul de exec. transm. spre main, în args, argumentele din linia de comandă </li></ul>
  74. 74. Tablouri (1) Tablourile sunt considerate (caz special de )obiecte în C# => decl . unui tablou nu creează tabloul int [] tab = new int[3]; Persoana[] grupa = new Persoana[30]; <ul><li>Parantezele se pot pune dup ă numele de tip sau de var. Se preferă prima formă
  75. 75. Numărul de elem. din tablou se cere la creare. Nu se poate modifica
  76. 76. Accesul la elem. tabl.: prin indici
  77. 77. Câmp implicit:
  78. 78. public final int L ength;
  79. 79. Sunt permise tablori de lungime zero (tabl. vide)
  80. 80. Sunt permise tablouri cu mai multe dimensiuni: </li></ul>int [][] intArray = new int [5][6];
  81. 81. Tablouri (2) Se acceptă şi: int [,] b = { { 0, 1 }, { 2, 3 }, { 4, 5 }, { 6, 7 }, { 8, 9 } }; for ( int i = 0; i < triPas.Length; i++) triPas [i,0] = i; Similar, cu iniţializare: int [][] triPas = { { 1 }, { 1, 1 }, { 1, 2, 1 }, { 1, 3, 3, 1 } }; Managed array
  82. 82. Enumerari <ul><li>Caz special de clase
  83. 83. public enum Volume { Low, Medium, High }
  84. 84. Numele între acolade: constantele (exemplarele) enumerării. Numai unul din acestea poate apare în orice utilizare a enumerării -> siguranţa tipurilor
  85. 85. Toate enumerările derivă din Enum (clasă abstractă) </li></ul>
  86. 86. Tablouri (2) Volume myVolume = Volume .Low; switch (myVolume) { case Volume .Low: Console .WriteLine( &quot;The volume has been turned Down.&quot; ); break ; case Volume .Medium: Console .WriteLine( &quot;The volume is in the middle.&quot; ); break ; case Volume .High: Console .WriteLine( &quot;The volume has been turned up.&quot; ); break ; }
  87. 87. EnumTricks (1) // declares the enum public enum Volume : byte { Low = 1, Medium, High } Dorim sa implementam un mecanism care sa permita conversia bidirectionala intre un nr. intreg si un element al unei enumerari.
  88. 88. EnumTricks (2) class Enumtricks { static void Main( string [] args){ Enumtricks enumtricks = new Enumtricks (); // demonstrates explicit cast // of int to Volume enumtricks.GetEnumFromUser(); // iterate through Volume enum by name enumtricks.ListEnumMembersByName(); // iterate through Volume enum by value enumtricks.ListEnumMembersByValue(); Console .ReadLine(); } /*...*/
  89. 89. EnumTricks (3) // get value user provided string volString = Console .ReadLine(); int volInt = Int32 .Parse(volString); // perform explicit cast from // int to Volume enum type Volume myVolume = ( Volume )volInt; Console .WriteLine( &quot;Volume Enum Members by Name:&quot; ); // get a list of member names from Volume enum, // figure out the numeric value, and display foreach(string volume in Enum .GetNames(typeof ( Volume ))){ Console .WriteLine( &quot;Volume Member: {0} Value: {1}&quot; ,volume,(byte) Enum .Parse(typeof( Volume ), volume)); }
  90. 90. EnumTricks (4) // get all values (numeric values) from the Volume // enum type, figure out member name, and display foreach ( byte val in Enum .GetValues( typeof ( Volume ))) { Console .WriteLine( &quot;Volume Value: {0} Member: {1}&quot; , val, Enum .GetName( typeof ( Volume ), val)); } Acest exemplu a fost preluat de la: http://www.csharp-station.com/Tutorials/Lesson17.aspx
  91. 91. Clase si metode generice Clase generice (1) class Stiva <E> { // declaratii de campuri // declaratii de metode public static void Main() { Stiva < String > stivasir = new Stiva < String >(); Stiva < Persoana > stivaint = new Stiva < Persoana >(); } } <ul><li>Tipul efectiv al elementelor stivei este dat at ât la declarare, cât şi la apelul constructorului;
  92. 92. Există un singur cod al clasei Stiva . Compilatorul poate verifica dacă operaţiile cu obiecte sunt corecte, pentru că are info de tip complete </li></ul>class Nod <S, D> { // declaratii de campuri // declaratii de metode } Nod < String , Persoana >nod1= new Nod < String , Persoana >();
  93. 93. Clase si metode generice Clase generice (2) <ul><li>Generics are the most powerful feature of C# 2.0 [MSDN]
  94. 94. GENÉRIC, -Ă, generici, -ce, adj. Care aparţine unei categorii întregi, privitor la o categorie întreagă (de fiinţe, obiecte , fenomene); care cuprinde toate cazurile de acelaşi fel. ♦ (Substantivat, n.) Partea de la începutul sau de la sfârşitul unui film, în care sunt indicate numele principalilor realizatori ai filmului respectiv. – Din fr. générique. [DexOnline]
  95. 95. Pt. aprofundare: http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx
  96. 96. O clasă generică declară una sau mai multe variabile de tip , între paranteze unghiulare după numele clasei. </li></ul>
  97. 97. Clase si metode generice Metode generice Variabilele de tip ale unei clase generice se fol. la decl. de câmpuri şi def. de metode ale clasei; public bool push(E elem) { if (top == 100) return false ; tab[top++] = elem; return true ; } public E pop() { if (top == 0) return default (E); ; return ((E)tab[--top]); } public void print() { for ( int i = top - 1; i >= 0; i--) { Console .Out.WriteLine((E)tab[i]); } }
  98. 98. “Tema”
  99. 99. Intrebari ???

×