Interfejs ma sens?

0

Wytłumaczcie mi proszę jaki sens ma dziedziczenie a dokładniej implementacja interfejsu w C++? Chodzi mi dokładnie o coś takiego:
tworzę sobie klasę interfejsu która ma powiedzmy 4 metody wirtualne.

I teraz żeby je "override'nąć " i tak muszę w klasie potomnej w nagłówku dodać nagłówki tych funckji a ciało zaimpolementować w .cpp

W c# przynajmniej tworze i klikam "Implement interface.." i mi tworzy sam te metody i tylko wpisuję w nie kod, ale w C++, jaka różnica czy stworzę interfejs czy nie jak i tak definicja w klasie potomnej jhest taka sama jakby interfejsu nie było

0

Akurat na identyczne zagadnienie sam trafiłem pisząc własną bibliotekę loggera-myślałem "a na pieruna mi interfejs,jak mogę udostępnić całą klasę?"Sprawa rozbiła się o inkludowanie nagłówków,tam gdzie mam "właściwą" klasę jest dołożona cała masa headerów które powinny być ukryte przed korzystającym z dllki.Niestety,udostępniając plik klasa_implementująca_interfejs.h kompilator zaczął się rzucać,że a to nie może znaleźć inkluda takiego,a to kolejnego itp.Musiałbym wszystkie te headery też udostępnić,a to rozwiązanie byłoby zwyczajnie do bani.
Żeby uniknąć takiej sytuacji zdefiniowałem w oddzielnym .h klasę interfejsu,który zaimplementowałem we właściwej klasie.Dzięki temu w docelowym projekcie wystarczy że dostarczę header klasa_interfejsu.h i już mam zapodaną całą potrzebną funkcjonalność i zarazem ukryte wszelkie klasy pomocnicze

0

W c# przynajmniej tworze i klikam "Implement interface.." i mi tworzy sam te metody

Mylisz pojęcia języka programowania i środowiska programistycznego (IDE). Możesz mieć automaty do każdego języka, to tylko kwestia wybajerzenia edytora.
Język jest zdefiniowany przez jego składnię, niezależnie od tego czy całość napisałeś ręcznie, czy została wygenerowana automatycznie.

0

A czy da się dzidziczyć prywatne pola?

Chodzi mi o to że chciałbym aby moja klasa bazowa miała:
a) publiczne metody
b) prywatny vector

no i chciałbym by klasa która poniżej dziedziczy odziedziczyła te elementy dokładnie z takimi samymi dostępami.
Da się tak zrobić, czy można dziedziczyć tylko pola publiczne?

0

Dziedziczysz wszystko jak leci,co najwyżej zaostrzając dostęp (przy class A : protected B wszystko co public w B wskoczy do A jako protected,a reszta bez zmian-ale to poczytaj sobie w jakiejś książce o tym)-tak więc pola private odziedziczysz jako private.Jedyny myk polega na tym,że z poziomu klasy pochodnej nie masz dostępu do prywatnych składników klasy bazowej

0
Dziedzic napisał(a)

A czy da się dzidziczyć prywatne pola?

Chodzi mi o to że chciałbym aby moja klasa bazowa miała:
a) publiczne metody
b) prywatny vector

no i chciałbym by klasa która poniżej dziedziczy odziedziczyła te elementy dokładnie z takimi samymi dostępami.
Da się tak zrobić, czy można dziedziczyć tylko pola publiczne?

Zmienić vector na chroniony (protected). Pole nadal nie jest publiczne, ale dostępne dla klas pochodnych

0
Dziedzic napisał(a)

A czy da się dzidziczyć prywatne pola?

Da się, ale w interfejsach zwykle się tych pól nie daje.
Bo mały problem jeśli to są pola typu bool, int, gorzej jeśli są to obiekty, które mogą być w klasach różnie przechowywane - w zależności od potrzeb. Tym się różni klasa abstrakcyjna od interfejsu:

  • klasa abstrakcyjna to klasa z abstrakcyjnymi metodami, która może mieć pola - w sekcji protected lub private
  • interfejs (w C++ implementowany przy użyciu klasy abstrakcyjnej) - nie zawiera pól

Generalnie im mniej klasy potomne wiedzą o sposobie przechowywania danych w przodku tym lepiej - czyli najlepiej stosować private i metody dostępu (get/set).

0

Zamiast dziedziczenia prywatnego lepiej zastosowac agregację. Wcielasz jako składową klasy obiekt klasy nadrzędnej i nie tracisz dostępu do jej prywatnych składników

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