Interfețe C#

Tradus din această pagină oficială de documentație Microsoft.

O interfață definește un contract care poate fi implementat de clase și struct-uri. O interfață poate conține metode, proprietăți, evenimente, și indexatori. O interfață nu furnizează implementări ai membrilor pe care îi definește — ea pur și simplu specifică membrii care trebuie să fie furnizați de clasele sau struct-urile care implementează interfața.

Interfețele pot folosi moștenire multiplă. In următorul exemplu, interfața IComboBox moștenește și de la ITextBox și IListBox.

interface IControl
{
    void Paint();
}
interface ITextBox: IControl
{
    void SetText(string text);
}
interface IListBox: IControl
{
    void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}

Clasele și struct-urile pot implementa mai multe interfețe. In exemplul următor, clasa EditBox implementează și IControl și IDataBound.

interface IDataBound
{
    void Bind(Binder b);
}
public class EditBox: IControl, IDataBound
{
    public void Paint() { }
    public void Bind(Binder b) { }
}

Când o clasă sau struct implementează o anumită interfață, instanțele acelei clase sau struct-uri pot fi implicit convertite la acel tip de interfață. De exemplu:

EditBox editBox = new EditBox();
IControl control = editBox;
IDataBound dataBound = editBox;

In cazurile în care o instanță nu este cunoscută static că implementează o anumită interfață, convertiri dinamice de tip pot fi folosite. De exemplu, următoarele instrucțiuni folosesc convertiri dinamice de tip pentru a obține implementările de interfețe IControl și IDataBound ale unui obiect. Deoarece tipul concret la timpul rulării al obiectului este EditBox, convertirile reușesc.



object obj = new EditBox();
IControl control = (IControl)obj;
IDataBound dataBound = (IDataBound)obj;

In clasa anterioară EditBox, metoda Paint din interfața IControl și metoda Bind din interfața IDataBound sunt implementate folosind membri publici. C# de asemenea suportă implementări de membri de interfață în mod explicit, dând voie clasei sau struct-urii să evite a face membrii publici. O implementare explicită a unui membru de interfață este scris folosind numele complet calificat al membrului de interfață. De exemplu, clasa EditBox poate implementa metodele IControl.Paint și IDataBound.Bind folosind implementări explicite de membri de interfață după cum urmează.

public class EditBox: IControl, IDataBound
{
    void IControl.Paint() { }
    void IDataBound.Bind(Binder b) { }
}

Membrii de interfață expliciți pot fi accesați doar prin tipul interfață. De exemplu, implementarea lui IControl.Paint furnizată de clasa anterioară EditBox poate fi invocată doar prin convertirea mai întâi a referinței EditBox la tipul interfață IControl.

EditBox editBox = new EditBox();
editBox.Paint();            // Eroare, nici o asemenea metodă
IControl control = editBox;
control.Paint();            // Ok

Tradus din această pagină oficială de documentație Microsoft.

Niciun comentariu:

Trimiteți un comentariu