Od zera do .Net Juniora: Interface i klasa abstrakcyjna

W dzisiejszym poście przedstawię czym są klasy abstrakcyjne oraz interfejsy. Post ten jest swego rodzaju pilotażowym postem w moim nowym cyklu “Od zera do .Net Juniora”. Będę w nim opisywał oraz pokazywał zagadnienia, z którymi powinna być zaznajomiona osoba starająca się o swoją pierwszą pracę jako Junior .Net Developer. Mam nadzieję że cykl się przyjmie, jeśli chcecie poczytać o jakiś zagadnieniach piszcie, z chęcią o nich napiszę, jeśli je znam, lub się ich nauczę, a potem napiszę, jeśli ich nie znam ;>

Klasy abstrakcyjne

Na początek proste pytanie: czym są klasy abstrakcyjne i do czego są nam potrzebne? Są to klasy, których obiektów nie możemy stworzyć. Możemy definiować w nich zmienne, możemy definiować w nich funkcje, jednak nie jesteśmy w stanie stworzyć instancji danej klasy. Klas tych używa się do definiowania zachowań wspólnych dla kilku obiektów, dzięki czemu nie musimy powielać kodu tego zachowania w każdej klasie dziedziczącej po naszej klasie abstrakcyjnej. Aby oznaczyć klasę jako abstrakcyjną używamy słowa kluczowego “abstract”, np:

public abstract class MyAbstractClass

w tym momencie nie jesteśmy w stanie stworzyć instancji klasy MyAbstractClass, jednak nasze klasy mogą dziedziczyć po klasie MyAbstractClass. Dla przykładu mamy klasy MyFirsFunnytClass oraz MySecondFunnyClass. Obie te klasy mają w sobie funkcję DoSomethingFun, która w obu przypadkach robi dokładnie to samo, tak, jak to zostało przestawione poniżej:

public class MyFirstFunnyClass
{
      public void DoSomethingFun()
      {
             //something fun
      }
}

public class MySecondFunnyClass
{
      public void DoSomethingFun()
      {
             //something fun
      }
}

W tym momencie dzięki zastosowaniu klasy abstrakcyjnej możemy “wyciągnąć” metodę DoSomethingFun do klasy abstrakcyjnej, dzięki czemu nasze klasy, dziedziczące po klasie abstrakcyjnej, będą mogły używać tej metody bez powielania kodu. Wszystko będzie wyglądało tak:

public abstract class MyAbstractFunnyClass
{
      public void DoSomethingFun()
      {
             //something fun
      }
}

public class MyFirstFunnyClass : MyAbstractFunnyClass
{
}

public class MySecondFunnyClass : MyAbstractFunnyClass
{
}

Klasy abstrakcyjne mogą posiadać w sobie metody wirtualne oraz abstrakcyjne. Czym one są? Metoda wirtualna to metoda, którą można(lecz nie trzeba) nadpisać w klasie dziedziczącej po naszej klasie abstrakcyjnej. Dzięki temu mechanizmowi możemy ustalić, które dokładnie klasy dziedziczące po naszej metodzie wirtualnej zachowują się podobnie, a które zupełnie inaczej. Metody takie oznacza się słówkiem “virual”, np:

virtual public void DoSomethingNotFunny()
{
     //not funny things
}

W tym momencie, chcąc zdefiniować nowe zachowanie dla naszej funkcji w klasie dziedziczącej wystarczy użyć słówka “override”, np:

override public void DoSomethingNotFunny()
{
     //other not funny things
}

Metody abstrakcyjne z kolei nie posiadają w naszej klasie bazowej ciała oraz muszą zostać nadpisane w klasie dziedziczącej. Oznacza się je słówkiem “abstract”, np:

abstract public void DoSomething()

a następnie w naszej klasie dziedziczącej użyjemy ponownie słówka “override”:

override public void DoSomething()
{
    //some stuff
}

Należy pamiętać, iż metody abstrakcyjne oraz wirtualne nie mogą być metodami prywatnymi oraz statycznym oraz są to jedyne metody, które możemy nadpisać słowem kluczowym “override”.

Interface

Czym są interfejsy? Interfejsy, podobnie jak klasy abstrakcyjne, nie mogą posiadać ani jednej swojej instancji. Wszystkie metody zawarte w interfejsie są automatycznie metodami abstrakcyjnymi, przez co klasy dziedziczące po interfejsie muszą zaimplementować każdą funkcję z interfejsu, lecz nie potrzebują do tego słowa kluczowego “override”. Interfejs oznacza się słowem kluczowym “interface”, np:

public interface IDoSomething

Dobrą praktyką jest w nazwie interfejsu umieszczać na samym początku duże “i”, aby oznaczyć, iż korzystamy z interfejsu. Do czego służą nam interfejsy? Pozwalają nam one operować na abstrakcji, co oznacza, iż nas w momencie pisania kodu niekoniecznie obchodzi implementacja metod z podanego interfejsu. Przykładowo, mamy interfejs IGetData, który posiada w sobie metodę GetData() tak jak to przedstawiono poniżej:

public interface IGetData
{
      void GetData();
}

Oczywiście w prawdziwym kodzie nasza metoda coś by zwracała, jednak dla uproszczenia przyjmijmy, iż to metoda void. Warto zauważyć, iż nie użyliśmy tutaj słowa “public”:metoda jest z definicji publiczna, ponieważ takie są założenia metody abstrakcyjnej – jest zawsze publiczna. Dzięki zastosowaniu interfejsu, w każdym miejscu w kodzie, w którym użyjemy metody GetData, możemy użyć zupełnie innej jej implementacji. załóżmy, iż stworzymy dwie klasy implementujące nasz interfejs:

public class GetDataFromFile : IGetData
{
      void GetData()
      {
             //getting data from file
      }
}

public class GetDataFromDatabase : IGetData
{
      void GetData()
      {
             //getting data from database
      }
}

Dzięki zastosowaniu interfejsu do zmiennej typu IGetData możemy przypisać obiekt obu naszych klas oraz stosować je zamiennie, czyli:

IGetData _fileReader = new GetDataFromFile();
IGetData _databaseReader = new GetDataFromDatabase();

Przykład ten pokazuje, iż interfejsy mogą uczynić nasz kod bardzo elastycznym na zmiany: jeśli znajdziemy nowe miejsce, z którego możemy pobierać dane (np jakieś API) wystarczy stworzyć klasę, która dziedziczy po IGetData oraz przypisać jej instancję zamiast instancji naszej poprzedniej klasy i voila, mamy nowy Data Source.

To by było na tyle, jeśli chodzi o klasy abstrakcyjne oraz interfejsy. Mam nadzieję, iż rozjaśniłem nieco ich ideę. Chętnie przyjmę wszelkie uwagi oraz krytykę, aby kolejne części cyklu były lepsze niż poprzednie. Jestem również, jak wspomniałem na początku, otwarty na wszelkie propozycje tematów.

Do przeczytania niedługo >

Advertisements

2 Replies to “Od zera do .Net Juniora: Interface i klasa abstrakcyjna”

  1. Wkradł Ci się mały błąd “Należy pamiętać, iż metody abstrakcyjne oraz wirtualne nie mogą być metodami publicznymi”. Nie mogą być prywatne i statyczne.

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s