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.

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.

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.

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).

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.

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.

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

0

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

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.

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