<?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[Abstraktes Interface, Gedankenproblem]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche für mich das abstrakte Interface Idiom umzusetzen und stoße auf ein paar Gedankenprobleme.</p>
<p>Ich hab eine Interface hierarchie, siehe hier:</p>
<pre><code class="language-cpp">namespace interface
{
	class A
	{
	public:
	  void irgendwas() = 0;

	};

	class B: public A
	{
	public:
	  void irgendwas() = 0;
	  void mehrirgendwas() = 0;
	  static B * createInstance() { return new BImpl; }
	};
}

namespace logic
{
	class BImpl: public interface:B
	{
	public:
	  void irgendwas() {...}
	  void mehrirgendwas() {...}
          void meinepublicMethode() {...}

	};
}
</code></pre>
<p>Alles im ns interface ist Hierarchisch, es gibt mehrere Ebenen, so C von B von A usw.<br />
Das Interface soll völlig frei von anderen Methoden sein (public und protected)<br />
Es sind durchaus weitere Methoden erlaubt, die sollen nur nicht im interface auftauchen.<br />
Daher gibt es von den relevanten Klassen eine KlasseImpl, die davon erbt, so kann createInstance einer Klasse quasi durch Polymorhpie B returnen, dort aber eine Instanz von BImpl packen.</p>
<p>Das funktioniert auch wunderbar, so wie es oben zu sehen ist (Syntax nicht getestet)</p>
<p>Mein Problem ist nun aber, ich würde gerne noch mehr Methoden und Attribute in die Klasse A packen, damit alle anderen Klassen diese automatisch mitvererben.<br />
Diese Sachen sollen aber nicht ins interface, weil der Enduser diese nicht benutzen soll. Was kann ich am besten tun? Ich kann schlecht eine AImpl erzeugen und dort alles reinpacken, weil ich ja an die Sachen garnicht rankomme, da ja meine Klasse B von A und nicht von AImpl erbt. Das soll aber auch so bleiben, ich möchte im Interface keine Implementierungsschicht dazwischen kleben haben.<br />
Mehrfachvererbung will ich auch vermeiden, weil es Diamantstrukturen und bei mehr Base-Klassen sogar mehrfache Diamanten erzeugt.</p>
<p>Ich kann auch BImpl nicht von AImpl erben lassen, weil ich dann keine Polymorphie mehr hätte (außer mit Mehrfachvererbung...)</p>
<p>Was gibt es noch für Lösungen? Das Konzept eines abstrakten Interfaces ist eingentlich recht sinnvoll, wie ich finde. Es hilft uns zumindest die Struktur sauber zu halten und Mehrfachvererbung würd das &quot;sauber halten&quot; tüchtig ruinieren</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/260712/abstraktes-interface-gedankenproblem</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 23:29:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/260712.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Feb 2010 17:55:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Abstraktes Interface, Gedankenproblem on Mon, 08 Feb 2010 17:55:53 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich versuche für mich das abstrakte Interface Idiom umzusetzen und stoße auf ein paar Gedankenprobleme.</p>
<p>Ich hab eine Interface hierarchie, siehe hier:</p>
<pre><code class="language-cpp">namespace interface
{
	class A
	{
	public:
	  void irgendwas() = 0;

	};

	class B: public A
	{
	public:
	  void irgendwas() = 0;
	  void mehrirgendwas() = 0;
	  static B * createInstance() { return new BImpl; }
	};
}

namespace logic
{
	class BImpl: public interface:B
	{
	public:
	  void irgendwas() {...}
	  void mehrirgendwas() {...}
          void meinepublicMethode() {...}

	};
}
</code></pre>
<p>Alles im ns interface ist Hierarchisch, es gibt mehrere Ebenen, so C von B von A usw.<br />
Das Interface soll völlig frei von anderen Methoden sein (public und protected)<br />
Es sind durchaus weitere Methoden erlaubt, die sollen nur nicht im interface auftauchen.<br />
Daher gibt es von den relevanten Klassen eine KlasseImpl, die davon erbt, so kann createInstance einer Klasse quasi durch Polymorhpie B returnen, dort aber eine Instanz von BImpl packen.</p>
<p>Das funktioniert auch wunderbar, so wie es oben zu sehen ist (Syntax nicht getestet)</p>
<p>Mein Problem ist nun aber, ich würde gerne noch mehr Methoden und Attribute in die Klasse A packen, damit alle anderen Klassen diese automatisch mitvererben.<br />
Diese Sachen sollen aber nicht ins interface, weil der Enduser diese nicht benutzen soll. Was kann ich am besten tun? Ich kann schlecht eine AImpl erzeugen und dort alles reinpacken, weil ich ja an die Sachen garnicht rankomme, da ja meine Klasse B von A und nicht von AImpl erbt. Das soll aber auch so bleiben, ich möchte im Interface keine Implementierungsschicht dazwischen kleben haben.<br />
Mehrfachvererbung will ich auch vermeiden, weil es Diamantstrukturen und bei mehr Base-Klassen sogar mehrfache Diamanten erzeugt.</p>
<p>Ich kann auch BImpl nicht von AImpl erben lassen, weil ich dann keine Polymorphie mehr hätte (außer mit Mehrfachvererbung...)</p>
<p>Was gibt es noch für Lösungen? Das Konzept eines abstrakten Interfaces ist eingentlich recht sinnvoll, wie ich finde. Es hilft uns zumindest die Struktur sauber zu halten und Mehrfachvererbung würd das &quot;sauber halten&quot; tüchtig ruinieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852602</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Mon, 08 Feb 2010 17:55:53 GMT</pubDate></item><item><title><![CDATA[Reply to Abstraktes Interface, Gedankenproblem on Mon, 08 Feb 2010 18:08:50 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Mein Problem ist nun aber, ich würde gerne noch mehr Methoden und Attribute in die Klasse A packen, damit alle anderen Klassen diese automatisch mitvererben.<br />
Diese Sachen sollen aber nicht ins interface, weil der Enduser diese nicht benutzen soll.</p>
</blockquote>
<p>Welchen Sinn hat es, etwas nach A legen zu wollen, was eh pure virtual werden soll, obwohl ein User das dann gar nicht verwenden können soll?<br />
Das Interface hat ja (u.A.) den Sinn, beliebige Pointer auf abgeleitete Klassen (-&gt;BImpl) an FUnktionen zu übergeben, die nur ein interface::A erwarten (Basisklassenzeiger eben).</p>
<p>Ansonsten mach doch die Funktion im Interface private und virtual. Das kannst du dann ruhig im BImpl nach public legen. Es bleibt trotzdem virtual.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852614</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 08 Feb 2010 18:08:50 GMT</pubDate></item><item><title><![CDATA[Reply to Abstraktes Interface, Gedankenproblem on Tue, 09 Feb 2010 07:02:32 GMT]]></title><description><![CDATA[<p>Also mit Pimpl hatte ich an der Stelle ziemliche Probleme, weil ich zum einen eine Menge Methoden durchreichen musste und zum anderen mit Vererbung-probleme bekommen habe.</p>
<p>Es soll ja eben keine Methode in A rein, weil die für das Interface nicht sichbar ist.<br />
Wenn ich aber intern in der Logik arbeite, also nichts mit dem Interface für den Clienten am Hut habe, möchte ich aber die public Methode der abstrakten Klasse A aufrufen.<br />
Wenn ich 10 Klassen habe, die von A erben, will ich nicht 10 mal die exakt gleiche Methode implementieren müssen. Dann hätt ich mir auch sparen können, diese nach A auszulagern</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852846</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Tue, 09 Feb 2010 07:02:32 GMT</pubDate></item><item><title><![CDATA[Reply to Abstraktes Interface, Gedankenproblem on Tue, 09 Feb 2010 11:10:05 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Also mit Pimpl hatte ich an der Stelle ziemliche Probleme, weil ich zum einen eine Menge Methoden durchreichen musste und zum anderen mit Vererbung-probleme bekommen habe.</p>
</blockquote>
<p>Was hat das mit Pimpl zu tun?</p>
<blockquote>
<p>Es soll ja eben keine Methode in A rein, weil die für das Interface nicht sichbar ist.<br />
Wenn ich aber intern in der Logik arbeite, also nichts mit dem Interface für den Clienten am Hut habe, möchte ich aber die public Methode der abstrakten Klasse A aufrufen.<br />
Wenn ich 10 Klassen habe, die von A erben, will ich nicht 10 mal die exakt gleiche Methode implementieren müssen. Dann hätt ich mir auch sparen können, diese nach A auszulagern</p>
</blockquote>
<p>Entweder hast du ein abstraktes Interface und damit keine implementierten Methoden (eben alles pure virtual) oder du hast eine normale abstrakte Basisklasse mit einigen pure virtual Funktionen.</p>
<p>Wo willst du denn auf diese zusätzlichen Funktionen zugreifen und wie?<br />
Reicht es nicht, wenn du die in a als protected deklarierst? Dann gehören die nicht zur öffentlichen Schnittstelle und clients schauen dumm aus der Wäsche.<br />
Zur Not ist &quot;friend&quot; dein Freund.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1852980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1852980</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 09 Feb 2010 11:10:05 GMT</pubDate></item><item><title><![CDATA[Reply to Abstraktes Interface, Gedankenproblem on Tue, 09 Feb 2010 12:27:02 GMT]]></title><description><![CDATA[<p>Seikilos schrieb:</p>
<blockquote>
<p>Es hilft uns zumindest die Struktur sauber zu halten und Mehrfachvererbung würd das &quot;sauber halten&quot; tüchtig ruinieren</p>
</blockquote>
<p>Wie kommst du zu dieser Aussage? Selbst Java lässt Mehrfachvererbung von Interfaces zu!</p>
<p>Konkret musst du die abstrakten Klassen virtuell vererben:</p>
<p>class B : public virtual A ...</p>
<p>class AImpl : public virtual A</p>
<p>class BImpl : public AImpl, public virtual B</p>
<p>Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1853046</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1853046</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Tue, 09 Feb 2010 12:27:02 GMT</pubDate></item></channel></rss>