<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Wie haltet ihr es mit Klassen, die alles geerbte überschreiben?]]></title><description><![CDATA[<p>Hallo,<br />
vermutlich kennt ihr ähnliche Probleme:<br />
Es ging los mit einem hübschen Containerwrapper. Dann dachte ich mir: &quot;Es wäre doch nett, wenn der Container im Falle dass er Pointer hält, diese beim Zugriff gleich dereferenzieren würde&quot;. Gesagt getan. Eine neue Klasse PointerContainer von der Containerklasse abgeleitet (schließlich ist ein Pointercontainer auch ein Container) und flux den Operator[] mit einer dereferenzierenden Version überschrieben.<br />
Aber dann war da natürlich nicht Schluss: Was für den Zugriffsoperator galt, sollte natürlich auch für die Iteratoren gelten. Und wenn die Iteratoren andere Typen hatten, mussten auch ein paar der Algorithmen angepasst werden. Und so weiter...<br />
Letztendlich war dann die einzige gemeinsame Methode <code>size()</code> .</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> Das ist ja wohl nicht der eigentliche Sinn der Vererbung.</p>
<p>1. Was würdet ihr jetzt machen? Alles so sein lassen wie es ist, oder die Klassen auseinanderfrickeln?</p>
<p>2. Was habe ich da beim Design falsch gemacht? Die ursprüngliche Entscheidung, dass ein Pointercontainerwrapper auch ein Containerwrapper ist, kam mir damals eingentlich ganz logisch vor und so ganz sehe ich auch nicht ein, was daran falsch sein soll. Aber das Endergebnis spricht dafür, dass ich da falsch liege.</p>
<p>3. Das ist sowieso ein Problem, welches ich öfters habe, selbst bei einfachen Beispielen. Ich meine damit nicht den klassischen &quot;Ein Auto ist ein Motor&quot;-Fehlschluss. Aber auch wenn man beispielsweise ein Auto einer bestimmten Marke von einem generischen Auto ableiten würde, so würde man doch extrem viele Methoden überschreiben müssen, weil Autos verschiedener Hersteller sich in den Details der Bedienung doch öfters unterscheiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/272055/wie-haltet-ihr-es-mit-klassen-die-alles-geerbte-überschreiben</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 02:31:06 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/272055.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 09 Aug 2010 16:16:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 16:16:05 GMT]]></title><description><![CDATA[<p>Hallo,<br />
vermutlich kennt ihr ähnliche Probleme:<br />
Es ging los mit einem hübschen Containerwrapper. Dann dachte ich mir: &quot;Es wäre doch nett, wenn der Container im Falle dass er Pointer hält, diese beim Zugriff gleich dereferenzieren würde&quot;. Gesagt getan. Eine neue Klasse PointerContainer von der Containerklasse abgeleitet (schließlich ist ein Pointercontainer auch ein Container) und flux den Operator[] mit einer dereferenzierenden Version überschrieben.<br />
Aber dann war da natürlich nicht Schluss: Was für den Zugriffsoperator galt, sollte natürlich auch für die Iteratoren gelten. Und wenn die Iteratoren andere Typen hatten, mussten auch ein paar der Algorithmen angepasst werden. Und so weiter...<br />
Letztendlich war dann die einzige gemeinsame Methode <code>size()</code> .</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /> Das ist ja wohl nicht der eigentliche Sinn der Vererbung.</p>
<p>1. Was würdet ihr jetzt machen? Alles so sein lassen wie es ist, oder die Klassen auseinanderfrickeln?</p>
<p>2. Was habe ich da beim Design falsch gemacht? Die ursprüngliche Entscheidung, dass ein Pointercontainerwrapper auch ein Containerwrapper ist, kam mir damals eingentlich ganz logisch vor und so ganz sehe ich auch nicht ein, was daran falsch sein soll. Aber das Endergebnis spricht dafür, dass ich da falsch liege.</p>
<p>3. Das ist sowieso ein Problem, welches ich öfters habe, selbst bei einfachen Beispielen. Ich meine damit nicht den klassischen &quot;Ein Auto ist ein Motor&quot;-Fehlschluss. Aber auch wenn man beispielsweise ein Auto einer bestimmten Marke von einem generischen Auto ableiten würde, so würde man doch extrem viele Methoden überschreiben müssen, weil Autos verschiedener Hersteller sich in den Details der Bedienung doch öfters unterscheiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937990</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 09 Aug 2010 16:16:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 16:22:57 GMT]]></title><description><![CDATA[<p>Nicht von Containern erben. Die Loesung auf das Problem anpassen und kein einzelnes Objekte/Klasse/Template erstellen, das alle moeglichen Faelle abdeckt. Zum Auto: Wenn viel Funktionalitaet ueberschrieben wird, dann ist ein Interface besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1937991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1937991</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Mon, 09 Aug 2010 16:22:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 16:41:15 GMT]]></title><description><![CDATA[<p>Wieso musst du denn die Algorithmen anpassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938001</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938001</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 09 Aug 2010 16:41:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 16:49:55 GMT]]></title><description><![CDATA[<p>Also nach meinem Verständnis _benutzt_ du eine bestehende Container-Klasse um eine weitere (PointerContainer) zu implementieren. Es besteht also eine klare Has-a-Beziehung (wird implementiert durch). Eine Is-a-Beziehung sagt ja soviel wie, verhält sich (genauso) wie. Ein PointerContainer verhält sich nicht so wie ein Container (zumindest nach deiner Beschreibung). Vielleicht kannst du eine gemeinsame Basisklasse für (Value-)Container und PointerContainer finden, aber das hängt vom Kontext ab. Wie immer kann es dazu aber unterschiedliche Meinungen geben. Ach ja, ein oft genannter Tipp ist, nicht zu vererben um Code zu sparen, sondern nur, wenn es nötig ist (z.B. um virtuelle Funktionen der Basis zu überschreiben). Andernfalls immer Komposition vorziehen. Ausnahmen bestätigen natürlich die Regel.</p>
<p>Gruß<br />
Don06</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938003</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Mon, 09 Aug 2010 16:49:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 17:07:29 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Wieso musst du denn die Algorithmen anpassen?</p>
</blockquote>
<p>Naja, schlecht gesagt. Eigentlich habe ich durch die Aktion die Algorithmen sogar zusammenfassen können. Ich hab's bloß ungeschickt gemacht, weil die Klasse halt langsam gewachsen ist. Ich hätte die Algorithmen gleich als freie Funktionen und nicht als Member implementieren sollen (das ist ein Fehler den ich ganz klar einsehe). Ich habe das jetzt so gelöst, dass die Containerwrapper die freie Funktion aufrufen, damit das Interface nicht gebrochen wird.</p>
<p>Don06 schrieb:</p>
<blockquote>
<p>Also nach meinem Verständnis _benutzt_ du eine bestehende Container-Klasse um eine weitere (PointerContainer) zu implementieren. Es besteht also eine klare Has-a-Beziehung (wird implementiert durch). Eine Is-a-Beziehung sagt ja soviel wie, verhält sich (genauso) wie. Ein PointerContainer verhält sich nicht so wie ein Container (zumindest nach deiner Beschreibung). Vielleicht kannst du eine gemeinsame Basisklasse für (Value-)Container und PointerContainer finden, aber das hängt vom Kontext ab. Wie immer kann es dazu aber unterschiedliche Meinungen geben. Ach ja, ein oft genannter Tipp ist, nicht zu vererben um Code zu sparen, sondern nur, wenn es nötig ist (z.B. um virtuelle Funktionen der Basis zu überschreiben). Andernfalls immer Komposition vorziehen. Ausnahmen bestätigen natürlich die Regel.</p>
</blockquote>
<p>Es sind Wrapper um einen bestehenden Container. Den bestehenden Container habe ich in der ersten Wrapperklasse per Komposition eingebunden. Und dann dachte ich mir, dass ich das Wrapperinterface noch anpassen könnte für den Fall, dass ein Pointercontainer gewrappt wird. Und daher habe ich den Pointercontainerwrapper vom Containerwrapper abgeleitet. Wobei wie gesagt die einzige Gemeinsamkeit am Ende war, dass sie beide den unterliegenden Container besitzen und dessen Größe einfach durchreichen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938006</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 09 Aug 2010 17:07:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 19:45:10 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>3. Das ist sowieso ein Problem, welches ich öfters habe, selbst bei einfachen Beispielen. Ich meine damit nicht den klassischen &quot;Ein Auto ist ein Motor&quot;-Fehlschluss. Aber auch wenn man beispielsweise ein Auto einer bestimmten Marke von einem generischen Auto ableiten würde, so würde man doch extrem viele Methoden überschreiben müssen, weil Autos verschiedener Hersteller sich in den Details der Bedienung doch öfters unterscheiden.</p>
</blockquote>
<p>Kannst du vielleicht noch ein anderes Beispiel bringen? Also irgendwas konkretes. Was du über deine PointerCollection schreibst verstehe ich nämlich nicht ganz. Bzw. wieso es da ein Problem geben sollte.</p>
<p>IMO ist ein PointerContainer&lt;T&gt; eben kein Container&lt;T&gt;, z.B. schonmal deswegen weil er ein anderes Interface hat. Daher sollte nix abgeleitet werden. Daher hätte ich es von Anfang an anders gemacht, daher verstehe ich das Problem nicht ganz <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938056</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Aug 2010 19:45:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 19:51:17 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Den bestehenden Container habe ich in der ersten Wrapperklasse per Komposition eingebunden. Und dann dachte ich mir, dass ich das Wrapperinterface noch anpassen könnte für den Fall, dass ein Pointercontainer gewrappt wird. Und daher habe ich den Pointercontainerwrapper vom Containerwrapper abgeleitet. Wobei wie gesagt die einzige Gemeinsamkeit am Ende war, dass sie beide den unterliegenden Container besitzen und dessen Größe einfach durchreichen.</p>
</blockquote>
<p>Jetzt versteh' ich gar nix mehr. Im ersten Beitrag schreibst du doch ausdrücklich <em>&quot;Eine neue Klasse PointerContainer von der Containerklasse abgeleitet&quot;</em>...</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938061</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938061</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 09 Aug 2010 19:51:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 19:53:37 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Den bestehenden Container habe ich in der ersten Wrapperklasse per Komposition eingebunden.</p>
</blockquote>
<p>Das war schlau.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Und dann dachte ich mir, dass ich das Wrapperinterface noch anpassen könnte für den Fall, dass ein Pointercontainer gewrappt wird. Und daher habe ich den Pointercontainerwrapper vom Containerwrapper abgeleitet.</p>
</blockquote>
<p>Das kann ich nicht nachvollziehen.<br />
Du mußt Dir die Frage stellen &quot;Ist die Kuh wirklich ein Säugetier?&quot; und nur wenn das stimmt, darfst Du erben.<br />
Ist ein vector&lt;int*&gt; ein vector&lt;int&gt;? Nee. Das war's doch schon, oder? Weiterführende Literatur: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672.html" rel="nofollow">Herr Bebel</a> scnr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938063</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938063</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 09 Aug 2010 19:53:37 GMT</pubDate></item><item><title><![CDATA[Reply to Wie haltet ihr es mit Klassen, die alles geerbte überschreiben? on Mon, 09 Aug 2010 20:46:47 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Eine neue Klasse PointerContainer von der Containerklasse abgeleitet (schließlich ist ein Pointercontainer auch ein Container)</p>
</blockquote>
<p>Da steckt der Fehler. Der Pointercontainer ist auch eine Art Container, ja. Aber nicht so eine Art Container wie die, von der du abgeleitet hast.<br />
Das ist so ein ähnliches Problem wie das &quot;Quadrat ist ein Rechteck&quot;-Problem: wenn ein Rechteck sich dadurch auszeichnet, dass es zwei unabhängige Kantenlängen hat, ist ein Quadrat kein Rechteck <em>in diesem Sinne</em>.</p>
<p>Das &quot;Vererbung bedeutet ist-ein&quot; ist keine vollständige Aussage. Es müsste heißen &quot;Vererbung bedeutet ist-mit-der-kompletten-Semantik-ein&quot;. Womit Pointercontainer-Vererbung ausscheidet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1938084</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1938084</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 09 Aug 2010 20:46:47 GMT</pubDate></item></channel></rss>