{"id":1526,"date":"2016-04-12T10:17:22","date_gmt":"2016-04-12T09:17:22","guid":{"rendered":"https:\/\/www.inovex.de\/\/?p=1526"},"modified":"2026-03-17T08:00:13","modified_gmt":"2026-03-17T07:00:13","slug":"das-fluent-interface-im-kontext-von-vererbung-und-polymorphie","status":"publish","type":"post","link":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/","title":{"rendered":"Das Fluent Interface im Kontext von Vererbung und Polymorphie"},"content":{"rendered":"<p>Der Einsatz von Fluent Interfaces und Method Chaining erfreut sich gro\u00dfer Beliebtheit und findet immer mehr Einzug in die APIs aktueller Produkte und Bibliotheken. Solche Funktionalit\u00e4ten zu implementieren kann aber mitunter recht komplex sein und kollidiert mit manchen althergebrachten Paradigmen und Best-Practices. Dieser Beitrag beschreibt die Probleme, die vor allem im Kontext von Vererbung und Polymorphie auftreten.<!--more--><\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_83 counter-hierarchy ez-toc-counter ez-toc-custom ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\"><p class=\"ez-toc-title\" style=\"cursor:inherit\"><\/p>\n<\/div><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#Vererbung-und-Polymorphie\" >Vererbung und Polymorphie<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#Erweiterung-von-Klassen-mit-Fluent-Interface\" >Erweiterung von Klassen mit Fluent Interface<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#StringBuilder-kann-nicht-erweitert-werden\" >StringBuilder kann nicht erweitert werden<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#Subklasse-als-Typparameter-in-allen-Superklassen\" >Subklasse als Typparameter in allen Superklassen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#Were-hiring\" >We&#8217;re hiring!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#Weiterlesen\" >Weiterlesen<\/a><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Vererbung-und-Polymorphie\"><\/span>Vererbung und Polymorphie<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Die Konzepte der Vererbung und der damit einhergehenden Polymorphie sind f\u00fcr Entwickler, die Wert auf Objektorientierung legen, seit langer Zeit ganz selbstverst\u00e4ndliche Werkzeuge, um Wiederverwendung zu erreichen, die verhasste Duplikation bei der Entwicklung zu vermeiden und damit die Wartbarkeit des Codes zu erhalten und zu verbessern\u00a0\u2013\u00a0zumindest bei der Arbeit mit Java oder anderen Sprachen mit einem Schwerpunkt auf OO.<\/p>\n<p>Allerdings gibt es viele Beispiele, bei denen die entstandenen Superklassen mehr einem Sammelkasten n\u00fctzlicher Funktionen f\u00fcr alle ihre Subklassen \u00e4hneln und der Aspekt der Polymorphie dabei viel zu kurz kommt. \u00c4hnlich wie bei der Entwicklung gegen Schnittstellen soll man auch hier davon profitieren, dass Instanzen von Subklassen \u00fcberall dort eingesetzt werden k\u00f6nnen, wo ihre Superklassen erwartet werden. Und wenn es nur um die Wiederverwendbarkeit von Funktionen geht, so bietet sich die Delegation als passende Alternative zur Vererbung an. Dabei ist es jedem \u00fcberlassen, ob adhoc-Instanzen oder statische Methoden an abstrakten Helferklassen bevorzug werden.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Erweiterung-von-Klassen-mit-Fluent-Interface\"><\/span>Erweiterung von Klassen mit Fluent Interface<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Nun bin ich k\u00fcrzlich auf ein Problem gesto\u00dfen, bei dem ich mit einem Fluent Interface arbeiten wollte, aber die gewohnte Nutzung von Polymorphie nicht so recht funktioniert hat.<\/p>\n<p>Ich habe es mit mehreren Klassen zu tun, die alle bestimmte Werte als Strings serialisieren sollen und daf\u00fcr jeweils einen <code>StringBuilder<\/code> verwenden. \u00c4hnlich dem <code>ToStringHelper<\/code> der <a href=\"https:\/\/github.com\/google\/guava\" target=\"_blank\" rel=\"noopener\">guava Bibliothek<\/a> sollen die Werte jeweils mit einer Beschreibung und bestimmten Verbindungszeichen aufgelistet werden, aber jeweils nur, wenn sie nicht Null sind. Daf\u00fcr gibt es eine Methode in einer gemeinsamen Superklasse, welche die Beschreibung, den Wert und den <code>StringBuilder<\/code> entgegennimmt.<\/p>\n<pre class=\"lang:java decode:true \" title=\"Methode in Superklasse\">StringBuilder builder = new StringBuilder();\r\n\r\nbuilder.append(\"overall description\");\t\t\t\t\/\/ hier wird das Fluent Interface benutzt\r\n\r\naddValueIfNotNull(\"first description\", firstValue, builder);\t\/\/ hier wird die Funktion der Oberklasse benutzt\r\n\r\n...\r\n\r\naddValueIfNotNull(\"last description\", lastValue, builder);\r\n\r\nString result = builder.toString();\r\n\r\n<\/pre>\n<p>Neben den Werten, die von der <code>addValueIfNotNull()<\/code> Methode eingef\u00fcgt werden, gibt es teilweise noch einige direkte Aufrufe am Fluent Interface des <code>StringBuilder<\/code> und ich finde, dass es besser w\u00e4re, dieses Konzept hier durchg\u00e4ngig anzuwenden. Also ist der naheliegende Schritt eine Erweiterung der Klasse <code>StringBuilder<\/code>, um die Methode <code>appendIfNotNull(String caption, Object value)<\/code> in das Fluent Interface zu integrieren und intern die vielen \u00fcberschriebenen <code>append(type)<\/code> Methoden zu nutzen, die bereits vorhanden sind. Nat\u00fcrlich soll dieser erweiterte <code>StringBuilder<\/code> auch weiterhin \u00fcberall eingesetzt werden k\u00f6nnen, wo bisher mit <code>StringBuilder<\/code>-Instanzen gearbeitet wurde. Vererbung und Polymorphie sollten das ja ohne Weiteres\u00a0erm\u00f6glichen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"StringBuilder-kann-nicht-erweitert-werden\"><\/span>StringBuilder kann nicht erweitert werden<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Leider musste ich feststellen, dass die Klasse <code>StringBuilder<\/code> als final deklariert ist. Es gibt zwar noch eine abstrakte Superklasse (die auch von <code>StringBuffer<\/code> erweitert wird) aber diese ist ebenfalls nicht zweckdienlich.<\/p>\n<p>Bei genauerer Betrachtung wird klar, warum der <code>StringBuilder<\/code> final ist, denn wie ich schon bei der Arbeit mit dem <a href=\"https:\/\/de.wikipedia.org\/wiki\/Erbauer_%28Entwurfsmuster%29\" target=\"_blank\" rel=\"noopener\">Builder Pattern<\/a> gelernt habe, l\u00e4sst sich ein Fluent Interface nur sehr schlecht mit Vererbung kombinieren und f\u00fchrt zu einer nicht ohne weiteres erweiterbaren Typhierarchie. In diesem Fall geht es um ein naives Fluent Interface, also ohne Grammatik, bei dem alle daf\u00fcr relevanten Methoden immer denselben Typ zur\u00fcckliefern. Zus\u00e4tzliche Methoden (z.B. <code>long StringBuilder.length()<\/code>) lassen wir hier au\u00dfen vor. Jede Methode des <code>StringBuilder<\/code> liefert auch einen solchen zur\u00fcck. W\u00fcrde man jetzt <code>append(String)<\/code> an einem <code>CustomStringBuilder<\/code> aufrufen, k\u00e4me kein <code>CustomStringBuilder<\/code> mehr zur\u00fcck und die zus\u00e4tzlichen Methoden w\u00e4ren nicht mehr verf\u00fcgbar.<\/p>\n<pre class=\"lang:java decode:true \" title=\"Vererbung von Fluent Interfaces funktioniert nicht\">class CustomStringBuilder extends StringBuilder { \t\/\/ nur hypothetisch, faktisch nicht m\u00f6glich\r\n\r\n\tpublic CustomStringBuilder appendValueIfNotNull(String caption, Object value){\r\n\r\n\t\tif(value != null) {\r\n\r\n\t\t\tappend(caption).append(\":\").append(value).append(\"\\n\");\t\t\/\/ hier kommt StringBuilder zur\u00fcck\r\n\r\n\t\t}\r\n\r\n\t\treturn this;\r\n\r\n\t}\r\n\r\n}\r\n\r\nnew CustomStringBuilder()\r\n\r\n\t.appendValueIfNotNull(\"description\",value)\r\n\r\n\t.append(\"\\n\")\r\n\r\n\t.appendValueIfNotNull(\"description\",value)\t\t\/\/ Fehler, denn .append() hat StringBuilder geliefert.\r\n\r\n\t.toString();\r\n\r\n<\/pre>\n<h2><span class=\"ez-toc-section\" id=\"Subklasse-als-Typparameter-in-allen-Superklassen\"><\/span>Subklasse als Typparameter in allen Superklassen<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Um die Methoden einer Superklasse so zu gestalten, dass sie wieder den Typ der konkreten Subklasse zur\u00fcckliefern, muss man dem <a href=\"https:\/\/en.wikipedia.org\/wiki\/Curiously_recurring_template_pattern\" target=\"_blank\" rel=\"noopener\">Curiously-Recurring Generics Pattern<\/a> folgen. Dabei erhalten alle Superklassen einen Typparameter F, der von allen konkreten Subklassen mit sich selbst belegt werden muss. Dann kann die Signatur der Superklassen diesen Typparameter als R\u00fcckgabetyp verwenden. Zus\u00e4tzlich kann man bereits eine Methode <code>F getThis()<\/code> bereitstellen, in der ein ungepr\u00fcfter Cast der aktuellen Instanz auf F durchgef\u00fchrt wird. Eine Konsequenz davon ist, dass alle gemeinsamen Superklassen in einer solchen Typhierarchie abstrakt sein m\u00fcssen und alle konkreten Subklassen final. Leider bietet die Sprachdefinition von Java keine M\u00f6glichkeit wirklich sicherzustellen, dass alle abstrakten Klassen einer Typhierarchy den Typparameter an ihre Superklassen durchreichen und alle konkreten Subklassen ihn auch wirklich mit <em>sich selbst<\/em> belegen und nicht mit einer anderen Subklasse.<\/p>\n<p>Da nun keine Vererbungsbeziehung zwischen den konkreten Subklassen bestehen kann, ist der Einsatz von Polymorphie hier etwas eingeschr\u00e4nkt. Man kann also vornehmlich die Wiederverwendung gemeinsamer Methoden durch Vererbung erreichen, aber nicht die Erweiterung von bereits instanziierbaren Klassen wie dem <code>StringBuilder<\/code>.<\/p>\n<pre class=\"lang:java decode:true \" title=\"Vererbung mit Fluent Interface\">\/\/ F muss von allen konkreten Subklassen mit sich selbst belegt werden, was nicht erzwingbar ist\r\n\r\nabstract class FluentBase&lt;F extends FluentBase&lt;F&gt;&gt; {\r\n\r\n\tprivate String value;\r\n\r\n  \tprivate F getThis() {\r\n\r\n    \t    \treturn (F) this;  \/\/ Warnung: unchecked cast\r\n\r\n    \t}\r\n\r\n\tpublic F withValue(String value) {\r\n\r\n\t\tthis.value = value;\r\n\r\n\t\treturn getThis();\r\n\r\n\t}\r\n\r\n}\r\n\r\nfinal class Fluent extends FluentBase&lt;Fluent&gt; {\r\n\r\n\t\/\/ nur eine instantiierbare Klasse, um die Funktion der Superklasse nutzbar zu machen.\r\n\r\n}\r\n\r\n\/\/ hat keine Typ-Beziehung zu Fluent\r\n\r\nfinal class ExtendedFluent extends FluentBase&lt;ExtendedFluent&gt; {\r\n\r\n\tpublic ExtendedFluent withExtendedValue(String caption, String value) {\r\n\r\n\t\treturn withValue(caption + \":\" + value + \"\\n\");\t\t\/\/ liefert durch die Superklasse den Typ ExtendedFluent zur\u00fcck\r\n\r\n\t}\r\n\r\n}\r\n\r\n<\/pre>\n<p>Ganz davon abgesehen, dass die Klassenhierarchie des <code>StringBuilder<\/code> in der Java Runtime nicht in dieser Form vorliegt, h\u00e4tte ich auch\u00a0nicht die M\u00f6glichkeit gehabt, <code>StringBuilder<\/code> als abstrakt zu erkl\u00e4ren und eine neue Ebene mit zwei neuen konkreten Subklassen einzuarbeiten. Au\u00dferdem ist damit immer noch keine Polymorphie zwischen <code>StringBuilder<\/code> und <code>CustomStringBuilder<\/code> m\u00f6glich.<\/p>\n<p>Letztlich bleibt in diesem Fall nur die Delegation von einem <code>CustomStringBuilder<\/code> zu einer internen <code>StringBuilder<\/code>-Instanz ohne jede Typbeziehung als L\u00f6sung. Solange ich dieses Objekt nur lokal verwende und nicht an andere Akteure \u00fcbergebe, die einen <code>StringBuilder<\/code> erwarten, kann ich wenigstens ein ununterbrochenes Fluent Interface genie\u00dfen.<\/p>\n<h2><span class=\"ez-toc-section\" id=\"Were-hiring\"><\/span>We&#8217;re hiring!<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Tapetenwechsel gef\u00e4llig? Wir sind auf der Suche nach begeisterten Software-Entwicklern, die uns im Umfeld von Java, .NET und JavaScript unterst\u00fctzen und auch von extravaganteren Sprachen wie Go, Elixir und Clojure nicht zur\u00fcckschrecken. <strong>Jetzt Bewerben!<\/strong><\/p>\n<h2><span class=\"ez-toc-section\" id=\"Weiterlesen\"><\/span>Weiterlesen<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Weitere Information zu unseren Leistungen gibt es auf\u00a0unserer <a href=\"https:\/\/www.inovex.de\/de\/leistungen\/\" target=\"_blank\" rel=\"noopener\">Website<\/a>, der direkte Kontakt zu uns ist telefonisch unter <a href=\"tel:+497216190210\">+49 721 619 021-0<\/a> oder jederzeit per <a href=\"mailto:list-blog@inovex.de\" target=\"_blank\" rel=\"noopener\">E-Mail an list-blog@inovex.de<\/a> m\u00f6glich.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Der Einsatz von Fluent Interfaces und Method Chaining erfreut sich gro\u00dfer Beliebtheit und findet immer mehr Einzug in die APIs aktueller Produkte und Bibliotheken. Solche Funktionalit\u00e4ten zu implementieren kann aber mitunter recht komplex sein und kollidiert mit manchen althergebrachten Paradigmen und Best-Practices. Dieser Beitrag beschreibt die Probleme, die vor allem im Kontext von Vererbung und [&hellip;]<\/p>\n","protected":false},"author":25,"featured_media":12438,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"ep_exclude_from_search":false,"footnotes":""},"tags":[68],"service":[425],"coauthors":[{"id":25,"display_name":"Sebastian Schmidt","user_nicename":"sschmidt"}],"class_list":["post-1526","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-backend","service-backend"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Das Fluent Interface im Kontext von Vererbung und Polymorphie - inovex GmbH<\/title>\n<meta name=\"description\" content=\"Dieser Beitrag beschreibt die Probleme, die beim Fluent Interface vor allem im Kontext von Vererbung und Polymorphie auftreten.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Das Fluent Interface im Kontext von Vererbung und Polymorphie - inovex GmbH\" \/>\n<meta property=\"og:description\" content=\"Dieser Beitrag beschreibt die Probleme, die beim Fluent Interface vor allem im Kontext von Vererbung und Polymorphie auftreten.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/\" \/>\n<meta property=\"og:site_name\" content=\"inovex GmbH\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/inovexde\" \/>\n<meta property=\"article:published_time\" content=\"2016-04-12T09:17:22+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-17T07:00:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"755\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sebastian Schmidt\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-1024x302.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:site\" content=\"@inovexgmbh\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sebastian Schmidt\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\u00a0Minuten\" \/>\n\t<meta name=\"twitter:label3\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data3\" content=\"Sebastian Schmidt\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/\"},\"author\":{\"name\":\"Sebastian Schmidt\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a2ffffeaeaa18b9961297ca47e5f3799\"},\"headline\":\"Das Fluent Interface im Kontext von Vererbung und Polymorphie\",\"datePublished\":\"2016-04-12T09:17:22+00:00\",\"dateModified\":\"2026-03-17T07:00:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/\"},\"wordCount\":921,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/fluent-interface-scaled.jpg\",\"keywords\":[\"Backend\"],\"articleSection\":[\"Applications\",\"General\",\"Infrastructure\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/\",\"name\":\"Das Fluent Interface im Kontext von Vererbung und Polymorphie - inovex GmbH\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/fluent-interface-scaled.jpg\",\"datePublished\":\"2016-04-12T09:17:22+00:00\",\"dateModified\":\"2026-03-17T07:00:13+00:00\",\"description\":\"Dieser Beitrag beschreibt die Probleme, die beim Fluent Interface vor allem im Kontext von Vererbung und Polymorphie auftreten.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/fluent-interface-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2016\\\/03\\\/fluent-interface-scaled.jpg\",\"width\":2560,\"height\":755},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Das Fluent Interface im Kontext von Vererbung und Polymorphie\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"name\":\"inovex GmbH\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#organization\",\"name\":\"inovex GmbH\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/2021\\\/03\\\/inovex-logo-16-9-1.png\",\"width\":1921,\"height\":1081,\"caption\":\"inovex GmbH\"},\"image\":{\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/inovexde\",\"https:\\\/\\\/x.com\\\/inovexgmbh\",\"https:\\\/\\\/www.instagram.com\\\/inovexlife\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/inovex\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UC7r66GT14hROB_RQsQBAQUQ\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/#\\\/schema\\\/person\\\/a2ffffeaeaa18b9961297ca47e5f3799\",\"name\":\"Sebastian Schmidt\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg5f905a8b3627c2eb15cdb285c29fe6cf\",\"url\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/www.inovex.de\\\/wp-content\\\/uploads\\\/Avatar_3000-scaled-96x96.jpg\",\"caption\":\"Sebastian Schmidt\"},\"url\":\"https:\\\/\\\/www.inovex.de\\\/de\\\/blog\\\/author\\\/sschmidt\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Das Fluent Interface im Kontext von Vererbung und Polymorphie - inovex GmbH","description":"Dieser Beitrag beschreibt die Probleme, die beim Fluent Interface vor allem im Kontext von Vererbung und Polymorphie auftreten.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/","og_locale":"de_DE","og_type":"article","og_title":"Das Fluent Interface im Kontext von Vererbung und Polymorphie - inovex GmbH","og_description":"Dieser Beitrag beschreibt die Probleme, die beim Fluent Interface vor allem im Kontext von Vererbung und Polymorphie auftreten.","og_url":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/","og_site_name":"inovex GmbH","article_publisher":"https:\/\/www.facebook.com\/inovexde","article_published_time":"2016-04-12T09:17:22+00:00","article_modified_time":"2026-03-17T07:00:13+00:00","og_image":[{"width":2560,"height":755,"url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","type":"image\/jpeg"}],"author":"Sebastian Schmidt","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-1024x302.jpg","twitter_creator":"@inovexgmbh","twitter_site":"@inovexgmbh","twitter_misc":{"Verfasst von":"Sebastian Schmidt","Gesch\u00e4tzte Lesezeit":"6\u00a0Minuten","Written by":"Sebastian Schmidt"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#article","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/"},"author":{"name":"Sebastian Schmidt","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a2ffffeaeaa18b9961297ca47e5f3799"},"headline":"Das Fluent Interface im Kontext von Vererbung und Polymorphie","datePublished":"2016-04-12T09:17:22+00:00","dateModified":"2026-03-17T07:00:13+00:00","mainEntityOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/"},"wordCount":921,"commentCount":0,"publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","keywords":["Backend"],"articleSection":["Applications","General","Infrastructure"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/","url":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/","name":"Das Fluent Interface im Kontext von Vererbung und Polymorphie - inovex GmbH","isPartOf":{"@id":"https:\/\/www.inovex.de\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#primaryimage"},"image":{"@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#primaryimage"},"thumbnailUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","datePublished":"2016-04-12T09:17:22+00:00","dateModified":"2026-03-17T07:00:13+00:00","description":"Dieser Beitrag beschreibt die Probleme, die beim Fluent Interface vor allem im Kontext von Vererbung und Polymorphie auftreten.","breadcrumb":{"@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#primaryimage","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2016\/03\/fluent-interface-scaled.jpg","width":2560,"height":755},{"@type":"BreadcrumbList","@id":"https:\/\/www.inovex.de\/de\/blog\/das-fluent-interface-im-kontext-von-vererbung-und-polymorphie\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.inovex.de\/de\/"},{"@type":"ListItem","position":2,"name":"Das Fluent Interface im Kontext von Vererbung und Polymorphie"}]},{"@type":"WebSite","@id":"https:\/\/www.inovex.de\/de\/#website","url":"https:\/\/www.inovex.de\/de\/","name":"inovex GmbH","description":"","publisher":{"@id":"https:\/\/www.inovex.de\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.inovex.de\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/www.inovex.de\/de\/#organization","name":"inovex GmbH","url":"https:\/\/www.inovex.de\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/2021\/03\/inovex-logo-16-9-1.png","width":1921,"height":1081,"caption":"inovex GmbH"},"image":{"@id":"https:\/\/www.inovex.de\/de\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/inovexde","https:\/\/x.com\/inovexgmbh","https:\/\/www.instagram.com\/inovexlife\/","https:\/\/www.linkedin.com\/company\/inovex","https:\/\/www.youtube.com\/channel\/UC7r66GT14hROB_RQsQBAQUQ"]},{"@type":"Person","@id":"https:\/\/www.inovex.de\/de\/#\/schema\/person\/a2ffffeaeaa18b9961297ca47e5f3799","name":"Sebastian Schmidt","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg5f905a8b3627c2eb15cdb285c29fe6cf","url":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg","contentUrl":"https:\/\/www.inovex.de\/wp-content\/uploads\/Avatar_3000-scaled-96x96.jpg","caption":"Sebastian Schmidt"},"url":"https:\/\/www.inovex.de\/de\/blog\/author\/sschmidt\/"}]}},"_links":{"self":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/1526","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/comments?post=1526"}],"version-history":[{"count":2,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/1526\/revisions"}],"predecessor-version":[{"id":66548,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/posts\/1526\/revisions\/66548"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media\/12438"}],"wp:attachment":[{"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/media?parent=1526"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/tags?post=1526"},{"taxonomy":"service","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/service?post=1526"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.inovex.de\/de\/wp-json\/wp\/v2\/coauthors?post=1526"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}