Pagina informaticii

Teste de informatică pentru liceu, articole C#, C/C++, PHP

Lecţia 8 - Clase

Vom începe cu câteva definiţii:

O clasă este un tip de dată definit de utilizator care se comportă ca un tip predefinit.

O instanţă a unei clase (sau un obiect al clasei) este o variabilă de tipul clasei respective.

O variabilă membră este o variabilă definită în cadrul unei clase.

O metodă (funcţie membră) este o funcţie definită în cadrul unei clase. Metodele pot accesa variabilele membre ale clasei.

Datele membre ale unei clase pot fi:

  • Variabilele membre
  • Metodele
  • Constructorii
  • Destructorul
  • Proprietăţile
  • Indexatorii
  • Operatorii supradefiniţi
  • Evenimentele
  • Delegaţii
Modificatorii de acces la datele membre ale unei clase sunt:
  • public - datele publice ale unei clase pot fi accesate de oriunde (interiorul şi exteriorul clasei)
  • private - datele membre private sunt accesibile doar în clasa care le conţine
  • protected - se comportă ca şi datele private, doar că la datele protected au acces datele membre ale claselor derivate
Orice dată membră a unei clase are un modificator de acces. Dacă modificatorul de acces pentru o anumită dată nu este specificat, atunci data membră respectivă este în mod implicit private.

În continuare vom construi o clasă ca exemplu pentru a înţelege mai bine noţiunile prezentate mai sus. Construim o clasă a numerelor raţionale, deci a fracţiilor de forma x / y, în care x şi y sunt numere întregi, iar numitorul y este nenul. Vom defini câteva metode ale acestei clase: iniţializarea numitorului şi numărătorului (în două moduri), afişarea unui număr raţional adunarea, înmulţirea a două numere raţionale, precum şi aducerea la forma ireductibilă a unui număr raţional.

using System;
using System.IO;
namespace ConsoleApplication1
{
  class Rational
  {
    private int x, y; // variabile membre private

    public void Init(int vx, int vy)
    {
      x = vx;
      y = vy;
    }

    public void Init() // metoda publica
    {
      x = y = 1;
    }

    private void FormaIreductibila() // metoda privata
    {
      int a, b, r;
      a = x;
      b = y;
      while (b != 0)
      {
        r = a % b;
        a = b;
        b = r;
      }
      x /= a;
      y /= a;
    }

    public void Suma(Rational p, Rational q)
    {
      x = p.x * q.y + p.y * q.x;
      y = p.y * q.y;
      FormaIreductibila();
    }

    public void Produs(Rational p, Rational q)
    {
      x = p.x * q.x;
      y = p.y * q.y;
      FormaIreductibila();
    }

    public void Afisare()
    {
      Console.Write(x + "/" + y);
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Rational a, b, c; // obiecte ale clasei
      a = new Rational();
      b = new Rational();
      c = new Rational();
      a.Init(3, 4); // corect, acceses o metoda publica
      b.Init(5, 7);
      a.FormaIreductibila(); //eroare, nu pot accesa o metoda publica din afara clasei
      c.Suma(a, b);
      //Afisez produsul a doua fractii:
      a.Afisare();
      Console.Write(" * ");
      b.Afisare();
      Console.Write(" = ");
      c.Afisare();
    }
  }
}

Constructori şi destructori

Constructorii sunt metode care poartă numele clasei în care sunt definiţi. Ei au rol de iniţializare. Constructorii nu returnează valori, nici măcar void. Orice clasă are cel puţin un constructor. Dacă nu definiţi unul, există unul implicit (altfel nu s-ar putea realiza iniţializarea). Pot exista mai mulţi constructori într-o clasă, dar dacă apar prea mulţi, există riscul apariţiei problemelor datorate faptului că la un moment dat s-ar putea să apară dubii legate de constructorul care a fost apelat.

Destructorul este unul singur într-o clasă. Ca şi constructorii, destructorul poartă numele clasei, dar este precedat de ~. Destructorul nu returnează valori, nu are parametri şi nici nu trebuie specificat un modificator de acces pentru el.

class C
{
  private int n;

  public C(int val) // constructor
  {
    n = val;
  }

  ~C() // destructor
  { }
}

Proprietăţi

Proprietatea este o dată membră a unei clase care permite accesul la o variabilă membră, indiferent dacă aceasta este publică sau privată. Proprietăţile sunt de fapt metode care permit modificarea sau vizualizarea valorilor variabilelor membre. Proprietăţile se disting de metode prin faptul că apelarea lor nu implică utilizarea parantezelor rotunde. Ele contin două blocuri get şi set, oricare din cele două putând lipsi.

public int Dim // proprietate
{
  get
  {
    return n;
  }
  set
  {
    n = value;
  }
}

Proprietăţile pot fi:

  • Read-Write când get şi set sunt publice
  • Read-Only când doar get este public
  • Write-Only când get este privat şi set este publică

Observaţi şi utilizarea cuvântului rezervat value pentru modificarea valorii variabilei membre n.

În continuare vă prezint codul sursă al unui program care implementează o clasă a tablourilor, în care sunt definiţi constructori, destructor, metode, proprietăţi.

using System;
using System.IO;
namespace ConsoleApplication1
{
  class Vector
  {
    private int[] t; // variabila membra privata
    private int n; // variabila membra privata

    public Vector(int dim, int valoare) // constructor
    {
      n = dim;
      t = new int[n];
      for (int i = 0; i < n; i++)
        t[i] = valoare;
      }

    public Vector(int dim) // al doilea constructor
    {
      n = dim;
      t = new int[n];
      Random R = new Random();
      for (int i = 0; i < n; i++)
        t[i] = R.Next(100);
    }

    ~Vector()
    {
      n = 0;
      t = null;
    }

    public void Init()
    {
      Random R = new Random();
      for (int i = 0; i < n; i++)
        t[i] = R.Next(100);
    }

    public void Afisare() // metoda publica
    {
      Console.WriteLine("Dimensiunea vectorului : " + n);
      Console.WriteLine("Elementele vectorului :");
      for (int i = 0; i < n; i++)
        Console.Write(t[i] + " ");
      Console.WriteLine();
    }

    public int Minim() // metoda publica
    {
      int i, minim;
      minim = t[0];
      for (i = 1; i < n; i++)
        if (minim > t[i])
          minim = t[i];
      return minim;
    }

    public int Dim // proprietate publica
    {
      get
      {
        return n;
      }
      set
      {
        n = value;
        t = null;
        t = new int[n];
        Init();
      }
    }
}

  class Program
  {
    static void Main(string[] args)
    {
      Vector v = new Vector(10); // se apeleaza aici constructorul cu un parametru
      v.Afisare();
      Console.WriteLine("Valoarea minima din vector este " + v.Minim());
      v.Dim = 25; // apelul lui set din proprietatea Dim
      Console.Write("Noua dimensiune a vectorului : " + v.Dim + "\n");
      v.Afisare();
    }
  }
}

Acest articol nu este complet. Adăugări şi eventual modificări se vor face în zilele următoare.

Despre autor
Author

Dan Pracsiu deţinător www.dponline.ro
Profesor, Liceul Teoretic "Emil Racoviță" Vaslui
Membru în Comisia Naţională a Olimpiadelor de Informatică
Pasiuni: istoria, călătoriile, fotografia, muzica clasică

Scrie un comentariu
Nume:

Comentariu:

15 + 10 =