Moștenire

Principiile moștenirii

Prin utilizarea moștenirii se poate defini o clasă generală care definește trăsături comune la un ansamblu de obiecte. Această clasă poate fi moștenită de către alte clase specifice, fiecare dintre acestea adăugând elemente care-i sunt unice ei.

O clasă care este moștenită se numește clasă de bază sau superclasă, iar o clasă care o moștenește pe aceasta se numește clasă derivată, sau subclasă, sau clasă descendentă.

  • Pe baza a ceea ce am amintit, putem spune că o clasă derivată este o versiune specializată sau extinsă a clasei de bază.
  • Clasă derivată moștenește toate elementele clasei de bază și-și adaugă altele proprii.
  • Clasă derivată nu poate să șteargă nici un membru al clasei de bază.

class ClasaDerivata : ClasaDeBaza
{

}

O clasă derivată poate la rândul ei să fie clasă de bază pentru o altă clasă. În acest fel se poate defini noțiunea de ierarhie de clase.

Limbajul C#, spre deosebire de C++, admite doar moștenirea simplă, în sensul că derivarea se admite doar dintr-o clasă de bază, fiind permisă doar derivarea publică.

În contextul mecanismelor de moștenire trebuie amintiți modificatorii abstract și sealed aplicați unei clase, modificatori ce obligă la și respectiv se opun procesului de derivare. Astfel, o clasă abstractă trebuie obligatoriu derivată, deoarece direct din ea nu se pot obține obiecte prin operația de instanțiere. în timp ce o clasă sigilată (sealed) nu mai poate fi derivată (e un fel de terminal în ierarhia claselor). O metodă abstractă este o metodă pentru care nu este definită o implementare, aceasta urmând a fi realizată în clasele derivate din clasa curentă. O metodă sigilată nu mai poate fi redefinită în clasele derivate din clasa curentă.

De exemplu, fie ”Muzician” clasa de bază (clasa generală) și ”Violonist” clasa derivată (clasa specializată).

using System;
using System.Collections.Generic;
using System.Text;
namespace Exemplu
{
    class Muzician
    {
        public void Canta(string nume)
        {
            Console.WriteLine("{0} canta", nume);
        }
    }
    class Violonist : Muzician
    {
        public void CantaLaVioara(string nume)
        {
            Console.WriteLine("{0} canta la vioara", nume);
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Muzician m = new Muzician();
            m.Canta("Ilie");
            Violonist n = new Violonist();
            n.Canta("Andrei");
            n.CantaLaVioara("Andrei");
            Console.ReadLine();
        }
    }
}
 poo5

Accesibilitatea membrilor moșteniți

Deseori, în procesul derivării, avem nevoie de acces la membrii moșteniți ai clasei de bază. Pentru aceasta se va folosi o expresie de tip base access.

De exemplu, dacă MembruB este un membru al clasei de bază, pentru a-l folosi într-o clasă derivată vom folosi, în aceasta, o expresie de forma:

base.MembruB

using System;
using System.Collections.Generic;
using System.Text;
namespace Exemplu
{
    class Program
    {
        class ClasaDeBaza
        {
            public string sir = "Sir din clasa de baza";
        }
        class ClasaDerivata : ClasaDeBaza
        {
            public string sir = "Sir din clasa derivata";
            public void afis()
            {
                Console.WriteLine("{0}", sir);
                Console.WriteLine("{0}"base.sir);
            }
        }
        static void Main(string[] args)
        {
            ClasaDerivata cd = new ClasaDerivata();
            cd.afis();
            Console.ReadLine();
        }
    }
}
 poo6

Utilizarea cuvântului cheie protected

Cuvântul cheie protected permite restrângerea accesului unui membru al clasei de bază doar la clasele sale derivate. Membrii protejați moșteniți devin în mod automat protejați.

Apelul constructorilor clasei de bază:

class ClasaDeBaza
{
    protected string var;
    public ClasaDeBaza(string var) //constructor
    {
        this.var = var;
    }
}
class Derivata : ClasaDeBaza
{
    public ClasaDeBaza(string var) : base(var)
    {
        ...
    }
}

Leave a comment