{"id":498,"date":"2017-01-28T17:16:02","date_gmt":"2017-01-28T16:16:02","guid":{"rendered":"http:\/\/www.steffen-liersch.de\/content\/de\/?p=498"},"modified":"2025-03-02T11:29:57","modified_gmt":"2025-03-02T10:29:57","slug":"reasonable-interface-usage","status":"publish","type":"post","link":"https:\/\/www.steffen-liersch.de\/content\/de\/2017\/01\/reasonable-interface-usage\/","title":{"rendered":"Der sinnvolle Einsatz von Schnittstellen"},"content":{"rendered":"<p>Die gro\u00dfe St\u00e4rke von Schnittstellen ist, dass sie nachtr\u00e4glich einer Ableitungslinie hinzugef\u00fcgt werden k\u00f6nnen.\u00a0In .NET wird bspw. die Schnittstelle IDisposable\u00a0f\u00fcr das <a href=\"\/content\/de\/2010\/02\/net-dispose-pattern\/\">Dispose-Pattern<\/a> verwendet.\u00a0In\u00a0Java dient die\u00a0Schnittstelle\u00a0AutoCloseable dazu, f\u00fcr Klassen die Verwendung der try-with-resources-Anweisung zu erm\u00f6glichen.<!--more--><\/p>\n<p>Schnittstellen werden immer\u00a0dann verwendet, wenn Modelle beschrieben werden m\u00fcssen, ohne dabei auch nur eine einzige Funktion zu implementieren. Schnittstellen sind besonders dann sinnvoll, wenn z.B. Plug-Ins f\u00fcr eine Anwendung erm\u00f6glicht werden m\u00fcssen.<\/p>\n<p>Klassen k\u00f6nnen beliebig viele Schnittstellen implementieren. Es handelt sich dann um\u00a0Mehrfachschnittstellenvererbung. Diese hebt sich deutlich von der aus heutiger Sicht unn\u00fctzen <a href=\"https:\/\/de.wikipedia.org\/wiki\/Mehrfachvererbung\" rel=\"noopener\">Mehrfachvererbung<\/a> von Klassen\u00a0ab, wie sie in C++ m\u00f6glich ist.<\/p>\n<h2>Erweiterbarkeit<\/h2>\n<p>Basisklassen k\u00f6nnen nachtr\u00e4glich erweitert werden, ohne die Kompatibilit\u00e4t zu beeintr\u00e4chtigen, sofern keine abstrakten Funktionen hinzuf\u00fcgt werden. F\u00fcr Schnittstellen ist dies nicht ohne Kompatibilit\u00e4tsverlust m\u00f6glich, da jede neue Funktion in jeder Klasse, die die jeweilige Schnittstelle implementiert, hinzugef\u00fcgt werden muss.\u00a0Konzepte, die auf Schnittstellen basieren, werden durch Hinzuf\u00fcgen neuer Schnittstellen erweitert.<\/p>\n<h2>Transparenzverlust<\/h2>\n<p>Die hohe Flexibilit\u00e4t von Schnittstellen f\u00fchrt zum teilweisen Verlust von Transparenz w\u00e4hrend der Entwicklung. Wird statt mit der konkreten Klasse mit der dazugeh\u00f6rigen Schnittstelle gearbeitet, kann w\u00e4hrend der Entwicklung nicht mehr ohne Weiteres herausgefunden werden, welche konkrete Implementierung f\u00fcr einen Funktionsaufruf genutzt wird. Der Vorteil der Abstraktion geht also zu Lasten der Transparenz.<\/p>\n<h2>Unn\u00f6tiger Einsatz<\/h2>\n<p>Stehen Schnittstellen am Anfang einer Klassenhierarchie\u00a0kann oft auf sie verzichtet werden. Wird stattdessen eine Basisklasse verwendet, k\u00f6nnen verschiedene Funktionen vorimplementiert werden. Das Ableiten von einer Basisklasse macht dann lediglich die Implementierung der abstrakten Funktionen zwingend erforderlich, w\u00e4hrend bei Schnittstellen stets alle Funktionen implementiert werden m\u00fcssen.<\/p>\n<p>Werden Schnittstellen\u00a0ausschlie\u00dflich\u00a0innerhalb eines einzigen Moduls verwendet,\u00a0verursachen\u00a0sie oft unn\u00f6tigen Aufwand\u00a0ohne erkennbaren\u00a0Nutzen verbunden mit dem Verlust von Transparenz.<\/p>\n<h2>Markierungsschnittstellen<\/h2>\n<p>Markierungsschnittstellen\u00a0sind leere Schnittstellen. Sie dienen dem alleinigen Zweck, eine Klasse\u00a0zu kennzeichnen. In\u00a0.NET und Java werden\u00a0Markierungsschnittstellen bspw. verwendet, um serialisierbare Objekte zu markieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die gro\u00dfe St\u00e4rke von Schnittstellen ist, dass sie nachtr\u00e4glich einer Ableitungslinie hinzugef\u00fcgt werden k\u00f6nnen.\u00a0In .NET wird bspw. die Schnittstelle IDisposable\u00a0f\u00fcr das Dispose-Pattern verwendet.\u00a0In\u00a0Java dient die\u00a0Schnittstelle\u00a0AutoCloseable dazu, f\u00fcr Klassen die Verwendung der try-with-resources-Anweisung zu erm\u00f6glichen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[21,19,29],"class_list":["post-498","post","type-post","status-publish","format-standard","hentry","category-various","tag-net","tag-basics","tag-java"],"_links":{"self":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/498","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/comments?post=498"}],"version-history":[{"count":9,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/498\/revisions"}],"predecessor-version":[{"id":830,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/498\/revisions\/830"}],"wp:attachment":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/media?parent=498"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/categories?post=498"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/tags?post=498"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}