Badanie uogólnień, specjalizacji i zależności w OOP

OOP (programowanie obiektowe) to paradygmat, który koncentruje się na obiektach i danych, a nie na działaniach i logice. Podczas pracy z OOP konieczne jest zidentyfikowanie obiektów i ich relacji.

W OOP problem jest rozkładany na wiele obiektów i ich związek ze sobą - proces znany jako modelowanie danych. Istotne relacje między obiektami obejmują: skojarzenie, uogólnienie, specjalizację, agregację, zależność i kompozycję. W tym artykule omówimy relacje zależności i dziedziczenia w OOP z przykładami kodu w C #, aby zilustrować koncepcje.

Zależność

Zależność to relacja między dwoma lub większą liczbą obiektów, w której implementacja obiektu zależy od innego obiektu lub obiektów. Jeśli jeden z tych obiektów ulegnie zmianie, może to mieć wpływ na inne obiekty. Relacja zależności między dwoma lub więcej obiektami jest przedstawiona w języku UML za pomocą przerywanych strzałek. Innymi słowy, gdy istnieje relacja zależności między dwoma lub więcej obiektami, obiekt musi wiedzieć o innych obiektach, od których zależy.

Rozważ klasy BlogEntry i View. Podczas gdy pierwsza zawiera wszystkie powiązane informacje związane z wpisami na blogu, druga dotyczy wyświetlania danych otrzymanych z klasy BlogEntry w interfejsie użytkownika. Zatem klasa View jest zależna od klasy BlogEntry, aby wyświetlać zawartość (wpisy blogu) w interfejsie użytkownika. Dlatego istnieje relacja zależności między klasami View i BlogEntry. Relacja zależności jest reprezentowana w UML za pomocą przerywanej strzałki.

public class BlogEntry

    {

        //Members of the BlogEntry class

    }

public class View

    {

        //Members of the View class

    }

Uogólnienie i specjalizacja

Uogólnienie można zdefiniować jako technikę wyodrębniania podstawowych cech (takich jak atrybuty, właściwości i metody) z dwóch lub więcej podklas, a następnie łączenia ich w uogólnionej klasie bazowej (zwanej również nadklasą). Wręcz przeciwnie, specjalizacja jest odwrotnością generalizacji - służy do reprezentowania relacji typu „typ” poprzez tworzenie podklas z istniejących klas bazowych.

Dziedziczenie definiuje się jako zdolność klasy do rozszerzania jednej lub większej liczby klas (znanych również jako klasy bazowe). Należy zauważyć, że uogólnienie jest najsilniejszą formą relacji klasowych, ponieważ klasy uczestniczące w relacji uogólnienia są ze sobą ściśle powiązane - większość wewnętrznych zawiłości klasy nadrzędnej jest widoczna dla klasy podrzędnej.

Klasa, która rozszerza klasę podstawową lub nadrzędną, jest również nazywana klasą podrzędną lub klasą pochodną. Dziedziczona lub uogólniona klasa rozszerza lub dziedziczy swoją klasę podstawową lub nadrzędną. W przypadku dziedziczenia klasa podrzędna dziedziczy metody i atrybuty klasy podstawowej lub nadrzędnej z wyjątkiem tych, które są prywatne. W istocie prywatni członkowie klasy bazowej nie są dziedziczeni, ponieważ należą „wyłącznie” do klasy, do której należą. Dlatego należy skorzystać z uogólnienia tylko wtedy, gdy trzeba przedstawić klasę, która jest w rzeczywistości bardziej wyspecjalizowaną formą innej klasy.

Dziedziczenie obejmuje następujące typy:

  • Pojedynczy
  • Wielokrotność
  • Wielopoziomowy
  • Hierarchiczne
  • Hybrydowy

Dziedziczenie pojedyncze to najprostsza forma dziedziczenia, w której jedna klasa rozszerza inną. Poniższy fragment kodu ilustruje tę formę dziedziczenia - zwróć uwagę, jak klasa BlogAuthor rozszerza klasę Author.

public class Author

    {

        //Members of the Author class

    }

public class BlogAuthor : Author

    {

        //Members of the BlogAuthor class

    }

W przypadku dziedziczenia wielokrotnego masz wiele klas bazowych, z których pochodzi klasa. Należy pamiętać, że dziedziczenie wielokrotne nie jest obsługiwane w językach programowania OOP, takich jak Java lub C #.

Następnym typem dziedziczenia na naszej liście jest dziedziczenie wielopoziomowe. W tej formie dziedziczenia masz klasy dziedziczone po sobie, tworząc łańcuch. Ilustruje to poniższy fragment kodu.

public class Person

    {

        //Members of the Person class

    }

public class Author : Person

    {

        //Members of the Author class

    }

public class BlogAuthor : Author

    {

        //Members of the BlogAuthor class

    }

W dziedziczeniu hierarchicznym masz klasy, które reprezentują strukturę hierarchiczną poprzez dziedziczenie, podobnie jak drzewo genealogiczne. W przypadku tego typu dziedziczenia masz więcej niż jedną klasę podrzędną mającą tę samą klasę podstawową lub nadrzędną. Innymi słowy, jest to rodzaj dziedziczenia, w którym co najmniej jedna klasa pochodna ma wspólną klasę podstawową lub nadrzędną.

Dziedziczenie hybrydowe to rodzaj dziedziczenia, w którym dwie lub więcej form dziedziczenia jest połączonych w jedną. Zasadniczo ten typ dziedziczenia jest połączeniem dwóch lub więcej form dziedziczenia w celu utworzenia zamkniętej struktury. Należy pamiętać, że dziedziczenie hybrydowe nie jest również obsługiwane w językach programowania obiektowych, takich jak C # lub Java.