Interface C# vs Class C++

Interface C# vs Class C++
0

Cześć,
uczę się C# i zastanawiam się czy jest jakaś znacząca różnica między Interfacem w C# a klasą np. abstrakcyjna w C++ po której będziemy dodatkowo dziedziczyć?
W C# nie możemy dziedziczyć po wielu klasach, ale w C++ już tak. Zamiast tego możemy dziedziczyć po wielu Interface'ach. W C++ nie ma natomiast Interface'ów, ale można dziedziczyć po wielu klasach...
Różnica jest na pewno taka, że class-y w C++ mogą zawierać m.in. zmienne składowe, a w Interface'ach już nie ma takiej możliwości, ale to akurat chyba na + dla C++ :P.

Proszę o waszą wypowiedź w tym zakresie. Próbuję lepiej zrozumieć mechanizm Interface'ów.

GironX
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 2 lata
  • Postów:59
0

Wielodziedziczenie ma jedną bardzo poważną wadę. Prowadzi do pierdyliona zależności i przetestowanie czegoś takiego to masakra. Podobnie będzie z refaktoryzacją.
W C# masz też klasy abstrakcyjne.
Operowanie na interfejsach masz zaaplikowane w niektórych wzorcach projektowych, np metoda wytwórcza, w której możesz tworzyć klasy nie znając logiki zawartej z metodach, właśnie dzięki interfejsom.

edytowany 1x, ostatnio: GironX
AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
2

To jest wszystko mocno umowne. W C++ nie ma interfejsów, ale czym jest totalnie abstrakcyjna klasa niezawierająca pól, z samymi pustymi metodami, np.

Kopiuj
class foo {
public:
  virtual void doStuff() = 0;
  virtual ~foo() { }
}

jeśli nie interfejsem właśnie?

0

@alagner no właśnie o to mi chodziło - wiele słyszałem o tym jaki to C# jest wspaniały bo ma chociażby te interface'y, a jak teraz tak się o tym uczę to jakoś nie rozumiem czym się ludzie zachwycają, bo przecież to samo można zrobić przy pomocy klasy abstrakcyjnej/pustej w C++. I właśnie nie byłem pewny czy to ja źle to rozumiem czy może nie ma się czym zachwycać i bać (dopiero uczę się używać tych interface'ów).

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 3 godziny
  • Lokalizacja:Wrocław
0
alagner napisał(a):

To jest wszystko mocno umowne. W C++ nie ma interfejsów, ale czym jest totalnie abstrakcyjna klasa niezawierająca pól, z samymi pustymi metodami, np.

Kopiuj
class foo {
public:
  virtual void doStuff() = 0;
  virtual ~foo() { }
}

jeśli nie interfejsem właśnie?

No jednak interfejs, to trochę mniej znaków.
I przede wszystkim nie chodzi o to, że są interfejsy, ale że nie ma wielodziedziczenia. Interfejsy to bardziej efekt takiego podejścia niż cel w sam sobie.

AL
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 3 lata
  • Postów:1493
0

No generalnie tak jak @somekind pisze, idzie o zwięzłość/czytelność. W C++ nastukasz się tych class+destruktorów wirtualnych, nazerujesz metod itd., w C# po prostu napiszesz "interface" i wiadomo o co chodzi, a efekt będzie +- ten sam (nie wiem jak C# działa pod maską, stąd to +-, ktoś oblatany w ce-płotku może tutaj doprecyzować).

Wielodziedziczenie jest probematyczne w momencie kiedy dochodzisz do "diamentu".
https://medium.freecodecamp.org/multiple-inheritance-in-c-and-the-diamond-problem-7c12a9ddbbec

edytowany 2x, ostatnio: alagner
Azarien
diament dziedziczenia to trochę wyolbrzymiony „problem”...
0

Dziękuję wszystkim za udział w wątku.

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:około 6 godzin
  • Lokalizacja:Szczecin
0

Największą zaletą interface jako osobnego konceptu jest to, że kompilator powstrzyma Cię (lub kolegę z akwarium, który dobrych praktyk uczył się na bootcampie) przed niefrasobliwym dodaniem niestatycznych zmiennych.

Sam brak wielodziedziczenia cały czas uważam za wadę, taka opcja powinna zostać pozostawiona programiście.


AL
Na którymś cppconie chyba była mowa o czymś w stylu „annotated C++”, gdzie do klasy możnaby dopisywać „interface”, wtedy kompilator sam miałby wygenerować wirtualny desktrutor i sprawdzać brak implementacji metod czy „datatype” zapewniający brak metod w klasie. Kojarzysz może? Bo chcę to sobie odświeżyć a nie potrafię tego znaleźć...
vpiotr
To "generative C++" wyglądało trochę jak "moje impresje n.t. C++/CLI i co z niego zamierzamy ustandaryzować". Mam nadzieje że to tylko taka pogadanka.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.