1 of 54

Tehnici avansate pentru

dezvoltarea aplicațiilor mobile

3 - Kotlin - Clase și obiecte

2 of 54

Clase și obiecte

2

3 of 54

Programarea orientată pe obiecte

  • Clasă = blueprint pentru obiecte
  • Obiect = instanță a unei clase
  • Concepte de bază OOP
    • Încapsulare
    • Abstractizare
    • Moștenire
    • Polimorfism

Kotlin - Clase și obiecte

3

4 of 54

Clase

  • Numele în Pascal case (fiecare cuvânt începe cu majusculă)
  • O clasă poate include:
    • Proprietăți = variabile
    • Metode = funcții
    • Constructori - crează instanțe ale unei clase

Kotlin - Clase și obiecte

4

5 of 54

Instanța unei clase

  • Runtime-ul Kotlin va folosi clasa pentru a crea un obiect de acel tip

  • Crearea unui obiect nou se numește instanțiere

  • val sau var - definirea variabilei care referă obiectul

Kotlin - Clase și obiecte

5

6 of 54

Instanța unei clase

  • val => variabilei nu i se poate atribui alt obiect
  • Dar se poate modifica starea obiectului prin schimbarea valorii proprietăților

Kotlin - Clase și obiecte

6

7 of 54

Metodele unei clase

  • Funcții - cuvantul cheie fun

Kotlin - Clase și obiecte

7

8 of 54

Apelul unei metode

  • O metodă se poate apela folosind un obiect al clasei

Kotlin - Clase și obiecte

8

9 of 54

Proprietățile unei clase

  • Variabile immutable (val) sau mutable (var)

Kotlin - Clase și obiecte

9

10 of 54

Funcțiile get și set

  • O proprietate immutable are doar get()
  • Compilatorul autogenereaza funcțiile get și set implicite

Kotlin - Clase și obiecte

10

11 of 54

Funcțiile get și set

  • Backing field - reține valoarea proprietății
    • identificatorul field folosit în getter și setter

  • Atenție: dacă încercați să modificați proprietatea în loc de field, va intra într-un un ciclu infinit de apeluri set

Kotlin - Clase și obiecte

11

12 of 54

Funcțiile get și set

  • Se pot implementa funcții get și set mai specifice

Kotlin - Clase și obiecte

12

13 of 54

Constructor

  • Specifică modul de inițializare a obiectelor la instanțiere
  • Cu sau fără parametri
  • Constructorul implicit
    • fără parametri
    • generat automat de compilatorul Kotlin

Kotlin - Clase și obiecte

13

14 of 54

Constructor cu parametri

  • Inițializarea proprietăților clasei
  • Proprietăți immutable - nu vrem să nu hardcodăm valorile

=> constructor cu parametri

  • Proprietățile se mută ca parametri ai constructorului

Kotlin - Clase și obiecte

14

15 of 54

Constructor cu parametri

  • La instanțierea obiectului - dăm valorile cu care vor fi inițializate proprietățile

  • Se pot folosi argumente cu nume pentru claritate:

Kotlin - Clase și obiecte

15

16 of 54

Tipuri de constructori

  • Constructor primar (unul singur)
    • Parte din antetul clasei
    • Implicit sau cu parametri
    • Nu include cod
  • Constructor secundar (unul sau mai mulți)
    • Cu sau fără parametri
    • Include cod pentru inițializare
    • Fiecare constructor secundar trebuie să-l inițializeze pe cel principal

Kotlin - Clase și obiecte

16

17 of 54

Constructor primar cu parametri

  • Pentru a inițializa proprietățile
  • Argumentele sunt asignate proprietăților
  • Cuvantul cheie constructor
    • opțional - se poate omite

Kotlin - Clase și obiecte

17

18 of 54

Constructor secundar

Kotlin - Clase și obiecte

18

19 of 54

Constructor secundar

  1. Declarația constructorului secundar
    • cuvântul cheie constructor
    • parametri
  2. Inițializarea constructorului primar
    • : this
    • parametri necesari pentru constructorul primar
  3. Corpul constructorului secundar
    • Codul rulat pentru inițializare

Kotlin - Clase și obiecte

19

20 of 54

Constructor secundar - exemplu

Kotlin - Clase și obiecte

20

21 of 54

Moștenire

21

22 of 54

Moștenire

Kotlin - Clase și obiecte

22

23 of 54

Moștenire

  • Facilitează refolosirea codului
  • În Kotlin clasele sunt final în mod implicit
    • ⇒ nu pot fi extinse
    • cuvântul cheie open pentru a face o clasă extensibilă

Kotlin - Clase și obiecte

23

24 of 54

Moștenire - subclasă

Kotlin - Clase și obiecte

24

25 of 54

Moștenire - exemplu

  • Parametri fără var/val => nu sunt proprietăți
    • => îi pasăm superclasei

Kotlin - Clase și obiecte

25

26 of 54

Relații între clase

  • IS-A = moștenire
  • HAS-A = compoziție
    • un obiect poate să includă o instanță a altei clase

Kotlin - Clase și obiecte

26

27 of 54

Relație HAS-A - exemplu

Kotlin - Clase și obiecte

27

28 of 54

Moștenire - suprascrierea metodelor

  • Comportament specific al subclasei
  • În superclasă metodele trebuie să aibă open în față

28

29 of 54

Moștenire - suprascrierea metodelor

  • În subclasă folosim override în fața metodelor

Kotlin - Clase și obiecte

29

30 of 54

Polimorfism

  • Capacitatea de a utiliza obiecte diferite într-un mod comun
  • Obiecte diferite => comportament diferit

30

31 of 54

Refolosirea codului din superclasă

  • Pentru a apela o metodă din superclasă în subclasă
    • => cuvântul cheie super

Kotlin - Clase și obiecte

31

32 of 54

Refolosirea codului din superclasă

Kotlin - Clase și obiecte

32

33 of 54

Moștenire - suprascrierea proprietăților

Kotlin - Clase și obiecte

33

34 of 54

Modificatori de vizibilitate

34

35 of 54

Modificatori de vizibilitate

  • Rol important pentru a realiza încapsularea

  • Ascunderea proprietăților/metodelor într-o clasă
  • Ascunderea claselor/interfețelor într-un pachet

  • Modificatori în Kotlin
    • public, private, protected, internal

Kotlin - Clase și obiecte

35

36 of 54

Modificatori de vizibilitate

  • public
    • Modificatorul implicit
    • Proprietăți și metode publice = accesibile de oriunde din afara clasei

  • private
    • Accesibile doar în aceeași clasă
    • Altă clasă nu le poate accesa

Kotlin - Clase și obiecte

36

37 of 54

Modificatori de vizibilitate

  • protected
    • Accesibile în clasa respectivă și în subclase

  • internal
    • Accesibile în același modul
      • modul = o colecție de fișiere sursă care pot fi compilate împreună
      • un proiect - mai multe module

Kotlin - Clase și obiecte

37

38 of 54

Modificatori de vizibilitate

  • Înaintea sintaxei de declarare a clasei/metodei/proprietății

  • Împiedicăm accesarea metodelor/proprietăților din alte clase

38

39 of 54

Vizibilitatea proprietăților

Kotlin - Clase și obiecte

39

40 of 54

Vizibilitatea funcțiilor set și get

  • Modificatorul lui set
    • poate să împiedice modificarea valorii proprietății
  • Modificatorul lui get
    • trebuie să se potrivească cu modificatorul proprietății

40

41 of 54

Vizibilitatea funcției set - exemplu

  • Dacă set este cel implicit => se poate omite corpul

41

42 of 54

Vizibilitatea metodelor

42

43 of 54

Vizibilitatea constructorilor

  • Trebuie păstrat cuvantul cheie constructor și parantezele dacă folosim modificator

Kotlin - Clase și obiecte

43

44 of 54

Vizibilitatea claselor

Kotlin - Clase și obiecte

44

45 of 54

Recomandări

  • Vizibilitate cât mai strictă a metodelor/proprietăților
    • Folosim private cât mai des posibil
    • Dacă nu se poate private => protected
    • Dacă nu se poate protected => internal
    • Dacă nu se poate internal => public

45

46 of 54

Modificatori de vizibilitate

Kotlin - Clase și obiecte

46

47 of 54

Delegarea gestiunii proprietăților

47

48 of 54

Interfața

  • Un contract care este respectat de către clasele care o implementează
    • clasele implementează proprietățile/metodele interfeței
  • Abstractizare - funcționalitate fără implementare

Kotlin - Clase și obiecte

48

49 of 54

Delegarea gestiunii proprietății

  • Cod duplicat în get/set
  • => Obiect delegat
    • Include funcții get/set care pot fi refolosite
    • Delegăm get/set către alt obiect
    • Cuvântul cheie by

Kotlin - Clase și obiecte

49

50 of 54

Clasa delegat - exemplu

Kotlin - Clase și obiecte

50

51 of 54

Clasa delegat

  • Clasa delegat implementează:
    • interfața ReadWriteProperty pentru tipul de date var
    • interfața ReadOnlyProperty pentru tipul de date val
  • Clasa delegat include:
    • metodele getValue() și setValue()
  • KProperty = o interfață care ne permite să accesăm metadatele proprietății delegate
  • fieldData = backing field pentru proprietate

Kotlin - Clase și obiecte

51

52 of 54

Folosire delegat

  • Setarea și modificarea proprietăților este delegată către obiectele de tip RangeRegulator
    • => nu avem cod duplicat

Kotlin - Clase și obiecte

52

53 of 54

Bibliografie

Kotlin - Clase și obiecte

53

54 of 54

Cuvinte cheie

  • Clasă
  • Obiect
  • Metodă
  • Proprietate
  • Get și set
  • Constructor
  • Moștenire
  • Compoziție
  • Suprascriere
  • Modificatori de vizibilitate
  • Interfață
  • Delegare

Kotlin - Clase și obiecte

54

54