Algoritmy a programování III

Týden 6

Rozhraní

Rozhraní definuje kontrakt, který lze implementovat pomocí tříd a struktur. Definujete rozhraní pro deklaraci schopností, které jsou sdíleny mezi různými typy. Rozhraní například definuje konzistentní způsob procházení System.Collections.Generic.IEnumerable<T> všech položek v kolekci, například pole. Rozhraní může obsahovat metody, vlastnosti, události a indexery. Rozhraní obvykle neposkytuje implementace členů, které definuje – pouze určuje členy, které musí být dodány třídami nebo strukturami, které implementují rozhraní.

Rozhraní mohou využívat více dědičnosti. V následujícím příkladu rozhraní IComboBox dědí z obou ITextBox a IListBox.


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

Třídy a struktury mohou implementovat více rozhraní. V následujícím příkladu třída EditBox implementuje a IControlIDataBound.


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

Když třída nebo struktura implementuje konkrétní rozhraní, instance této třídy nebo struktury lze implicitně převést na tento typ rozhraní. Například


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

Výčty

Typ výčtu definuje sadu konstantních hodnot. Následující enum kód deklaruje konstanty, které definují různé kořenové zeleniny:


public enum SomeRootVegetable
{
    HorseRadish,
    Radish,
    Turnip
}

Můžete také definovat, který enum se má použít v kombinaci jako příznaky. Následující deklarace deklaruje sadu vlajek pro čtyři roční období. Může být použita libovolná kombinace ročních období, včetně All hodnoty, která zahrnuje všechna roční období:


[Flags]
public enum Seasons
{
    None = 0,
    Summer = 1,
    Autumn = 2,
    Winter = 4,
    Spring = 8,
    All = Summer | Autumn | Winter | Spring
}

Následující příklad ukazuje deklarace obou předchozích výčtů:


var turnip = SomeRootVegetable.Turnip;var spring = Seasons.Spring;
var startingOnEquinox = Seasons.Spring | Seasons.Autumn;
var theYear = Seasons.All;

Typy nullable

Proměnné libovolného typu mohou být deklarovány jako nenulové nebo s možnou hodnotou null. Proměnná s možnou hodnotou null může obsahovat další null hodnotu, která neudávají žádnou hodnotu. Typy hodnot s možnou hodnotou null (struktury nebo výčty) jsou reprezentovány hodnotou System.Nullable<T>. Referenční typy s možnou hodnotou null i odkaz s možnou hodnotou null jsou reprezentovány základním referenčním typem. Rozdíl je reprezentován metadaty přečtené kompilátorem a některými knihovnami. Kompilátor zobrazí upozornění při dereferencování odkazů s možnou hodnotou null, aniž by nejprve zkontroloval jejich hodnotu proti null. Kompilátor také poskytuje upozornění, když je odkazům, které nemají hodnotu null, přiřazena hodnota, která může být null. Následující příklad deklaruje int s možnou hodnotou null a inicializuje ho na null. Pak nastaví hodnotu na 5. Ukazuje stejný koncept s řetězcem s možnou hodnotou null. Další informace najdete v tématech typy hodnot s možnou hodnotou null a odkazové typy s možnou hodnotou null.


int? optionalInt = default; 
optionalInt = 5;
string? optionalText = default;
optionalText = "Hello World.";

N-tice

C# podporuje řazené kolekce členů, které poskytují stručnou syntaxi pro seskupení více datových prvků v jednoduché datové struktuře. Vytvoření instance řazené kolekce členů deklarací typů a názvů členů mezi ( a ), jak je znázorněno v následujícím příkladu:


(double Sum, int Count) t2 = (4.5, 3);
Console.WriteLine($"Sum of {t2.Count} elements is {t2.Sum}.");
//Output:
//Sum of 3 elements is 4.5.