<?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 erstelle ich ein Interface korrekt?]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Ich möchte mir ein Interface für eine Datenbankverbindung erstellen. Dazu wollte ich follgende abstrakte Methoden deklarieren:</p>
<pre><code class="language-cpp">virtual void connect() = 0;
   virtual bool connected() = 0;
   virtual void disconnect() = 0;
</code></pre>
<p>Ich geh mal davon aus, das es ganz sinnvoll ist, diese Methoden abstrakt zu deklarieren. Leider bin ich was unsicher, was folgende Methoden angeht:</p>
<pre><code class="language-cpp">virtual void setHost(const std::string &amp;hostName) = 0;
   virtual void setUser(const std::string &amp;user) = 0;
   virtual void setPwd(const std::string &amp;pwd) = 0;

   virtual const std::string &amp; host() const;
   virtual const std::string &amp; user() const;
   virtual const std::string &amp; pwd() const;
</code></pre>
<p>Diese Methoden werden unbestritten benötigt, um die Verbindungsparameter zu setzen(zumindest die Setter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )<br />
Allerdings bieten solche Methoden nur Zugriff auf Attribute einer Klasse. Aber mein Interface besitzt ja keine Attribute.<br />
Diese müßten die abgeleiteten Klassen enthalten. Daher meine Frage:</p>
<p>Sollten in Interfaces nur &quot;Worker&quot; abstrakt deklariert werden,</p>
<pre><code class="language-cpp">virtual void connect() = 0;
</code></pre>
<p>oder definiert ihr auch Methoden, die den Zugriff auf Attribute gestattet?</p>
<pre><code class="language-cpp">virtual void setHost(const std::string &amp;hostName) = 0;
   virtual const std::string &amp; host() const;
</code></pre>
<p>Egal wie ich das Interface implementiere, es wird sehr warscheinlich funktionieren. Allerdings wollte ich nicht unbedingt den dümmsten Weg einschlagen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich fänd's schön, wenn ihr mir mit euerer Erfahrung helfen könntet.</p>
<p>NuckNuck</p>
<p>[Edit]<br />
Tippfehler bei connected()</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/164959/wie-erstelle-ich-ein-interface-korrekt</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 03:19:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/164959.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Nov 2006 09:25:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 10:19:29 GMT]]></title><description><![CDATA[<p>Hallo zusammen.</p>
<p>Ich möchte mir ein Interface für eine Datenbankverbindung erstellen. Dazu wollte ich follgende abstrakte Methoden deklarieren:</p>
<pre><code class="language-cpp">virtual void connect() = 0;
   virtual bool connected() = 0;
   virtual void disconnect() = 0;
</code></pre>
<p>Ich geh mal davon aus, das es ganz sinnvoll ist, diese Methoden abstrakt zu deklarieren. Leider bin ich was unsicher, was folgende Methoden angeht:</p>
<pre><code class="language-cpp">virtual void setHost(const std::string &amp;hostName) = 0;
   virtual void setUser(const std::string &amp;user) = 0;
   virtual void setPwd(const std::string &amp;pwd) = 0;

   virtual const std::string &amp; host() const;
   virtual const std::string &amp; user() const;
   virtual const std::string &amp; pwd() const;
</code></pre>
<p>Diese Methoden werden unbestritten benötigt, um die Verbindungsparameter zu setzen(zumindest die Setter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> )<br />
Allerdings bieten solche Methoden nur Zugriff auf Attribute einer Klasse. Aber mein Interface besitzt ja keine Attribute.<br />
Diese müßten die abgeleiteten Klassen enthalten. Daher meine Frage:</p>
<p>Sollten in Interfaces nur &quot;Worker&quot; abstrakt deklariert werden,</p>
<pre><code class="language-cpp">virtual void connect() = 0;
</code></pre>
<p>oder definiert ihr auch Methoden, die den Zugriff auf Attribute gestattet?</p>
<pre><code class="language-cpp">virtual void setHost(const std::string &amp;hostName) = 0;
   virtual const std::string &amp; host() const;
</code></pre>
<p>Egal wie ich das Interface implementiere, es wird sehr warscheinlich funktionieren. Allerdings wollte ich nicht unbedingt den dümmsten Weg einschlagen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Ich fänd's schön, wenn ihr mir mit euerer Erfahrung helfen könntet.</p>
<p>NuckNuck</p>
<p>[Edit]<br />
Tippfehler bei connected()</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174271</guid><dc:creator><![CDATA[nucknuck]]></dc:creator><pubDate>Tue, 14 Nov 2006 10:19:29 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 09:31:57 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Wenn du ein reines abstaktes Interface willst, must du auch die Implementierung von Gettern und Settern in die abzuleitenden Klassen verlegen.<br />
Wenn du &quot;nur&quot; eine Basisklasse willst, die der kleinste gemeinsame Nenner aller möglichen Datenbankverbindungen sein soll (ausgehend vom üblichen Standard mit Host, Port, Login, Password...), dann kannst du solche allgemeinen Attribute auch in die Basisklasse implementieren.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174273</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Tue, 14 Nov 2006 09:31:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 09:37:09 GMT]]></title><description><![CDATA[<p>Du definnierst eine allgemeine Schnittstelle zum Zugriff auf Datenbanken. Datenbanken laufen im allgemeinen auf einem Host und man muß sich an ihnen per Login und Passwort anmelden...</p>
<p>Daher würde ich diese Zugriffsmethoden als allgemein ansehen auch wenn deren Implementierung nicht durch die Schnittstelle erfolgt.</p>
<p>Allerdings solltest du berücksichtigen, dass hinter Host/Benutzer/Passwort auch ein nicht veränderbarer Wert sein kann, also nicht zwingend setzbar sein muß.</p>
<p>Wenn du die Funktionen nur in den abgleiteten Klassen deklarierst/definierst wird die Schnittstelle nur eingeschränkt nutzbar, da du doch wieder zwischen den unterschiedlichen abgeleiteten Klassen unterscheiden mußt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174281</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 14 Nov 2006 09:37:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 09:39:08 GMT]]></title><description><![CDATA[<p>Danke akari, für die verdammt schnelle Antwort.</p>
<p>Jetzt kommt die Kretchenfrage <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Was wäre deiner Meinung denn sinnvoller?<br />
Ein Interface, in dem die Getter und Setter abstrakt sind, oder &quot;nur&quot; eine Basisklasse?</p>
<p>Ups!<br />
Ich stelle fest, das ich nicht genau weiß, wann ein Interface und wann eine Basisklasse zu verwenden ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Vielleicht kann mir da jemand auf die Sprünge helfen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174283</guid><dc:creator><![CDATA[nucknuck]]></dc:creator><pubDate>Tue, 14 Nov 2006 09:39:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 09:42:52 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10111">@Mathias</a><br />
Ich hoffe ich hab dich richtig verstanden.<br />
Sobald eine Methode so allgemein ist, das sie für alle abgeleiteten Klassen gültig ist, sollte sie in das Interface / die Basisklasse.</p>
<p>Ich hatte noch im Kopf, das Getter und Setter normalerweise gute Kandidaten für inline Methoden sind. Das wird jedoch was schwierig, wenn diese inline sind.</p>
<p>Oder täusche ich mich da?</p>
<p>NuckNuck</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174286</guid><dc:creator><![CDATA[nucknuck]]></dc:creator><pubDate>Tue, 14 Nov 2006 09:42:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 09:45:39 GMT]]></title><description><![CDATA[<p>nucknuck schrieb:</p>
<blockquote>
<p>Ein Interface, in dem die Getter und Setter abstrakt sind, oder &quot;nur&quot; eine Basisklasse?</p>
</blockquote>
<p>Das hängt von deiner Datenverwaltung ab - wenn jede (echte) DB-Klasse ihren eigenen Weg findet, Host etc zu speichern, reichen in der Basisklasse die abstrakten Methoden. Wenn alle abgeleiteten Klassen die gleiche Implementierung nutzen, kannst du die Getter/Setter inklusive der dahinterliegenden Datenelemente auch in der Basisklasse implementieren (auch die abgeleiteten Klassen haben das Recht, auf diese Methoden zuzugreifen, um z.B. ihren Connection String zusammenzubauen).</p>
<blockquote>
<p>Ich stelle fest, das ich nicht genau weiß, wann ein Interface und wann eine Basisklasse zu verwenden ist. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>In C++ gibt es keine Interfaces. Da gibt es nur abstakte und konkrete Klassen (erstere können NUR als Basisklasse verwendet werden - und sind wohl die beste Näherung an Interfaces, die C++ zu bieten hat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174288</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 14 Nov 2006 09:45:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 09:51:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a><br />
Wenn ich also eine allgemeine Methode implementiere, um auf eine Datenbank zuzugreifen, dann implementiere ich eine Basisklasse.<br />
Möchte ich nur die Schnittstelle vorgeben und die Implementierung den abgeleiteten Klassen überlassen, dann ist ein Interface angebracht.</p>
<p>Ich hoffe ich das jetzt richtig zusammengefasst.</p>
<p>@Alle<br />
Danke für die fixen und guten Antworten<br />
NuckNuck</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174292</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174292</guid><dc:creator><![CDATA[nucknuck]]></dc:creator><pubDate>Tue, 14 Nov 2006 09:51:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 10:00:44 GMT]]></title><description><![CDATA[<p>Ich würde die Getter/Setter nicht mit in das Interface stecken. Derjenige, der das DB-Connection-Objekt instanziert muß eh eine konkrete Klasse haben, die dann diese Setter anbietet. Für den späteren Programmverlauf sind diese Setter und Getter unwichtig. Sollten diese gebraucht werden, sollte z.B. der Client wissen, welche konkrete Klasse er mal instanziert hat.</p>
<p>Alternativ könnte man auch ein Context-Shield-Pattern einsetzen. D.h. du schreibst zwei Interfaces: eine große Klasse und ein abgespecktes Interface, welches nur die nötigsten hält.</p>
<p>Beispiel (Pseudocode!):</p>
<pre><code class="language-cpp">class BigConnection {
public:
     name; // setter/getter
     password; // setter/getter
     host; // setter/getter
};
</code></pre>
<p>So, in die BigConnection (Name neigt zur Übertreibung) steht alles wichtige und für komfort nötige.<br />
Dann kannst du eine Context-Klasse/Interface bauen:</p>
<pre><code class="language-cpp">class ConnectionContext
{
private:
     BigConnection*; // die wird nicht bekannt gegeben!!! auch nicht über getter!
public:
     name; // nur getter
     password; // nur getter
     host; // nur getter
}
</code></pre>
<p>Bau dir dann in die BigConnecetion so ne Art Faktory-Methode rein, die alles instanziert und dem User aber nur eine ConnectioContext zurück gibt. Das hat auch den Vorteil, das in der BigConnection kritische public-Methode stehen können, die aber der User des Context niemals erreichen wird. Aber über den Context gibst du ihm das raus, was du ihm erlauben willst.</p>
<p>So hast du trotzdem eine kleine Schnittstelle für den User.</p>
<p>Ich finde das Context Shield Pattern einfach nur genial. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174298</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 14 Nov 2006 10:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 10:00:30 GMT]]></title><description><![CDATA[<p>Du würfelst da was durcheinander...</p>
<p>Zuerst kommt das Design. Dort entscheidet man wo was sichtbar ist (und da kann es sein, dass ich in einer Schnittstelle auch den Zugriff auf einen Datensatz erlaube).</p>
<p>Ob eine Funktion inline ist oder nicht entscheidet man erst später beim Implementieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174301</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 14 Nov 2006 10:00:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 10:17:39 GMT]]></title><description><![CDATA[<p>Wenn eine Klasse per Definition einen Attributsatz besitzt, sehe ich keinen Grund diesen nicht auch zugreifbar zu machen unabhängig davon ob jetzt die Klasse den Attributsatz implementiert oder erst die abgeleiteten Klassen.</p>
<p>(Was natürlich nicht heißt, das man es auch anders implementieren kann. Viele Wege führen nach Rom...) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174314</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174314</guid><dc:creator><![CDATA[Mathias]]></dc:creator><pubDate>Tue, 14 Nov 2006 10:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wie erstelle ich ein Interface korrekt? on Tue, 14 Nov 2006 10:23:17 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1463">@Artchi</a><br />
Hmm, dieses Context Shield Pattern war mir bisher unbekannt. Das werd ich mir mal genauer ansehen. Danke für den Tipp.</p>
<p>Meine Überlegung für ein Interface war folgende:<br />
- Der Benutzer der Verbindung soll nur die Verbindungdaten(host, user, ...) besitzen<br />
- Die Art der Verbindung soll für den Benutzer keine Rolle spielen (MySQL, Oracle, ...)<br />
- Das Verbindungsobjektes soll über eine Factory erzeugt werden</p>
<p>Das ganze sollte ungefähr so zu verwenden sein:</p>
<pre><code class="language-cpp">BasisConnection *con = Factory::createConnection(host);
   con-&gt;setUser(&quot;&quot;);
   con-&gt;setPwd(&quot;&quot;);
   con-&gt;setPort(12345);
   con-&gt;connect();
</code></pre>
<p>Nun gut, die Klasse besitzt per Definition die obigen Attribute. Dann sollte es ja auch ok sein, wenn die Getter und Setter abstrakt deklariert werden.<br />
Ich wollte das ganze einfach nicht von vorneherein falsch angehen.<br />
Daher Danke für die vielen Antworten.</p>
<p>NuckNuck</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1174325</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1174325</guid><dc:creator><![CDATA[nucknuck]]></dc:creator><pubDate>Tue, 14 Nov 2006 10:23:17 GMT</pubDate></item></channel></rss>