Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

1

13.07.2017, 18:49

Abstrakte Klasse oder Interface?

Hallo,
ich habe mal eine Frage zur Nutzung von abstrakten Klassen und/oder Interfaces.

Erbe ich von einer abstrakten Klasse mit einer abstrakten Methode, so muss ich diese mit override implementieren. Packe ich ein Interface mit einer Methode hinzu, so muss ich diese ebenfalls implementieren.

Mit beiden Möglichkeiten kann ich von Objekten, die eines der beiden Wege implementieren, Methoden aufrufen, da der Compiler weiß, dass die Methode implementiert sein muss.

Jetzt ist meine Frage, wieso ich überhaupt Interfaces nehmen muss. Einfach, weil ich nur eine abstrakte Klasse implementieren kann und Interfaces so viele wie ich möchte? Oder gibt es da noch andere Gründe?

Weil rein vom Vorgehen her erscheinen mir die beiden doch sehr ähnlich / gleich.

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

2

13.07.2017, 18:56

Bei C# und Java sind Interfaces eine Möglichkeit um Mehrfachvererbung zu "simulieren" da du nur von einer Klasse erben kannst.
Bei C++ liegen die Vorzüge zwischen Interfaces und abstrakten Klassen etwas tiefer.

Grundsätzlich ist aber, dass eine Klasse die ein Interface implementiert alle Methoden implementieren MUSS, abstrakte Klassen müssen nicht komplett implementiert werden.

Renegade

Alter Hase

Beiträge: 494

Wohnort: Berlin

Beruf: Certified Unity Developer

  • Private Nachricht senden

3

13.07.2017, 19:03

Hallo Garzec,
das Schlüsselwort abstract sagt, das ein Objekt unvollständig ist. Das Schlüsselwort ist nicht nur gültig bei Methoden, sondern auch für Klassen und Eigenschaften. abstract (C#-Referenz)
Das Schlüsselwort interface ist ausschließlich als "Ersatz" für das Schlüsselwort class zulässig und besagt lediglich das jene Klasse die diese Schnittstelle realisiert die Signatur der Schnittstelle besitzen muss. interface (C# Referenz)

Mit den beiden Konstrukten drückst du etwas unterschiedliches aus. Deine Klasse IST Teil der abstrakten Klasse und vervollständigt diese, oder deine Klasse HAT einen Teil, welcher die Signatur einer Schnittstelle realisiert.

Konkret ist es meist so, dass eine abstrakte Basisklasse Verhalten besitzt welche in allen ableitenden Klassen benötigt wird, aber ein Teil muss von der ableitenden Klasse umgesetzt werden. Bei Schnittstellen gibt es kein gemeinsames Basisverhalten, sondern lediglich eine Signatur die jede realisierende Klasse implementieren muss. An dieser Stelle möchte ich darauf hinweisen, dass es in vielen Fällen sinnvoller ist, Verhalten als eigene Klasse zu kapseln und sie nicht in eine Basisklasse zu schreiben. Als Referenz solltest du dir unbedingt das Strategy Pattern ansehen.

"Identifiziere jene Aspekte, die sich ändern und trenne sie von jenen, die konstant bleiben."
Liebe Grüße,
René

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »Renegade« (13.07.2017, 19:18)


Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

4

13.07.2017, 19:27

Hm ja..

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

13.07.2017, 20:58

Abstrakte Klassen stellen eine Vererbung her, während Interfaces mehr eine Teil-Funktionalität beschreiben, die auch ohne Verwandtschaft existiert. Das ist semantisch was anderes. Beispiel:
Ein Pinguin ist ein Vogel. Ein Vogel ist ein Tier. Eindeutig also Vererbung und (vielleicht abstrakte) Basis-Klassen. Nun gibt es Tiere, die fliegen können, aber Vögel, die es nicht können. Das wäre nun also ein Interface, denn viele Dinge können fliegen. Und vielleicht ist nur genau diese Tatsache wichtig. Wenn man z.B. Schießübungen machen will. Da schießt man ja vielleicht ungern auf Vögel (von denen Pinguine ja nicht mal fliegen können!). Aber ob man auf Luftballons oder auf Tonscheiben schießt (die keinerlei Basisklasse teilen), ist egal. Man muss nur etwas haben, was fliegen kann.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (13.07.2017, 21:04)


Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

6

13.07.2017, 21:09

das Beispiel ist gut :)

Jar

Treue Seele

Beiträge: 197

Wohnort: Lübeck

Beruf: Softwareentwickler

  • Private Nachricht senden

7

14.07.2017, 10:36

Das gute alte Vogel Beispiel :)
Es sollte eine "Gefällt mir" Möglichkeit geben :)

Garzec

Alter Hase

  • »Garzec« ist der Autor dieses Themas

Beiträge: 693

Wohnort: Gießen

  • Private Nachricht senden

8

14.07.2017, 11:09

Auf dem Discord Server hättest du @BlueCobold dafür ein Karma geben können :P

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

14.07.2017, 11:48

Ach, Discord, dieses neumodische Zeug. :D
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

14.07.2017, 11:58

Wer braucht schon Karma?

Werbeanzeige