Interfejs ma sens?

Odpowiedz Nowy wątek
2011-08-17 13:57
Pytający
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

Pozostało 580 znaków

2011-08-17 14:07
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


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2011-08-18 10:14
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.

Pozostało 580 znaków

2011-08-18 13:04
Dziedzic
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?

Pozostało 580 znaków

2011-08-18 13:10
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


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]

Pozostało 580 znaków

2011-08-18 14:36
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

Pozostało 580 znaków

2011-08-19 10:07
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).

edytowany 2x, ostatnio: vpiotr, 2011-08-19 10:08

Pozostało 580 znaków

2011-08-19 10:42
gość
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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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