Dziedziczenie - czy warto?

0

Witam. Mam dylemat w kwestii programowania obiektowego.
Otoz jesli mam np. klase Figura, ktora jest jednoznacznie definiowana przez posiadane przez siebie pole (np. zbior wierzcholkow) , i wiem, ze w programie bedzie mi potrzebna klasa np Szescian i Kula, to czy powinienem wyprowadzic dla nich nowe klasy dziedziczace z Figury, np:

Kula : Figura
{
  const Ksztalt ksztalt = ksztaltKuli;
}

czy raczej pozostac przy ogolnej klasie Figura, a np. kule tworzyc poprzez konstruktor:

Figura
{
  const Ksztalt ksztalt;
  konstruktorFigury(Ksztalt k)
  {
    ksztalt = k;
  }
}

Bardziej przychylam sie do rozwiazania nr 2., bo jest bardziej ogolne i umozliwia tworzenie nowych figur w runtime, ale praktycznie w kazdej ksiazce jako przyklad OOP podaje sie wlasnie Figure i klasy Kwadrat : Figura, itp.

0

Dziedziczenie stosuj tylko wtedy gdy musisz. Jeśli wygodniejsze jest inne rozwiązanie to powinieneś zastosować właśnie je, dziedziczenie ma Ci ułatwić życie, i tylko po to się je stosuje.

0

Kontynując przedmówcę. Dziedziczenie służy do określania cech charakterystycznych. Przykład z figurą i kwadratem jest bardzo dobry. Dlaczego? Ponieważ Figura zapewnia wspólnych interfejs dla wszystkich swoich podklas, a te podklasy dostarczają konkretnej implementacji NIEKTÓRYCH cech takich jak pole czy obwód. Jednocześnie masz pewność, że możesz łatwo wyciągnąć pewne abstrakcyjne dane np. stosunek pola do obwodu czy też dane wierzchołków.
Może to zabrzmieć dziwnie, ale dziedziczenie jest podobne do używania interfejsów z tą różnicą, że w momencie tworzenia kodu wiesz dokładnie jak będą wyglądać niektóre z metod. Reszta będzie uzależniona od konkretnego przypadku.

0

Właściwa organizacja klas nie jest ani łatwa ani szbka. Jednak dobrze zaprogramowane dzedziczenie poprawia czytelność i stabilność kodu oraz znacząco może zmniejszyć jego rozmiar. Jeżeli tylko jakaś metoda jest wspólna dla kilku klas - dziedziczenie. Jest ono podstawą OOP które jest podstawą współczesnych HLL.

type
  TFigura = class
  public
    Pole, Obwod :Integer;

    constructor Create();
    procedure Pole(); abstract; // indywidualna dla każdego potomka
    procedure Obwod(); abstract; // indywidualna dla każdego potomka
    procedure WyswietlWyniki(); // wspólne dla wszystkich
    Procedure ZerujPola();  // wspólne dla wszystkich
  end;

  TKwadrat = class(TFigura)
    procedure Pole();
    procedure Obwod();
  end;

  TKolo = class(TFigura)
    procedure Pole();
    procedure Obwod();
  end;

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