Interfejs - przeznaczenie

0

Cześć, dobrze to rozumiem? Interfejs pozwala nam zrobić kolekcję elementów różnych klas (które implementują ten interfejs). A co co poza tym, bo jakoś mam problem ze zrozumieniem tego zagadnienia

najlepiej jakiś krótki/realny przykład, nie będący typu foo/bar aaa/bbb kotek/pies :P

public interface IFlyable
{
    void Fly();
}

class Bird : IFlyable
{
    public void Fly() 
    {
        Console.WriteLine("bird flies");
    }
}

class Plane : IFlyable
{
    public void Fly() 
    {
        Console.WriteLine("plane flies");
    }
}

public class Program
{
    public static List<IFlyable> GetBirdInstancesAndPlaneInstancesMixed()
    {
        return new List<IFlyable> {new Bird(), new Plane()};
    }

    public static void Main(string[] args)
    {
        List<IFlyable> things = GetBirdInstancesAndPlaneInstancesMixed();
        foreach(IFlyable item in things)
        {
           item.Fly();
        }
    }
}
0

Najprościej mówiąc, interfejsy określają składniki, które klasa musi zawierać implementując dany interfejs. To pozwala traktować obiekty różnych klas jednakowo.
Najprostszym chyba przykładem będzie wzorzec projektowy strategia, gdzie klasa klienta zawiera zdefiniowany składnik typu interfejs. Zmieniając ten składnik zmieniamy zachowanie klienta. Na przykład:

public class Klient
{
    public IPerformer Performer {get; set; }
   
    public void Perform
        {
            Performer.Act();
        }
}

public interface IPerformer
{
    void Act();
}

public class Dancer : IPerformer
{
    public void Act()
    {
        Console.WriteLine("Ja tańczę!");
    }
}

public class Singer : IPerformer
{
    public void Act()
    {
        Console.WriteLine("Ja śpiewam!");
    }
}

A realny przykład? Pierwsza rzecz, która mi przychodzi do głowy to na przykład testy jednostkowe. Wyobraź sobie, że mamy klasę, która łączy się z bazą danych. W trakcie testów oczywiście nie chcemy tego robić. Więc przygotowujemy nową klasę, która implementuje ten sam interfejs ale w swej implementacji tylko imituje połączenie z bazą danych.
Jeśli interesuje cię zastosowanie interfejsów to polecam zgłębić tematy takie jak "kompozycja ponad dziedziczenie" i wstrzykiwanie zależności.

0

@wonsz: załóżmy, że chcesz mieć metodę, która przyjmie jakiś obiekt, żeby wywołać na nim jego metodę Fly, ale poza tym tej nowej metody typ obiektu nie obchodzi. Wtedy wystarczy, że przyjmie argument typu IFlyable, i będzie bez znaczenia, jakiej konkretnie klasy obiekt przekażesz, byle tylko implementował ten interfejs.

1 użytkowników online, w tym zalogowanych: 0, gości: 1