<?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[Design - Austauschbare Klassen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine bestehende Klasse Matrix, die ich gerne verwenden will und die auch alle Eigenschaften erfüllt, die ich momentan brauche. DAs Problem ist nur, dass die Klasse jederzeit durch eine andere Matrix-Klasse ersetzt werden soll, d.h. der Code sollte möglichst portabel sein.<br />
Ich steh jetzt ein wenig an, wie ich das am besten designen könnte? Gibt es eventuell Design-Patterns, die genau dieses Problem lösen. Ich denke ein Interface könnte eine Lösung sein. Und in anderen Klassen wird nur das Interface verwendet. Jede Matrix-Klasse muss dann aber wiederum dieses Interface implementieren..<br />
Vielleicht hat wer Tipps?<br />
Danke.</p>
<p>Gruß,<br />
Lemmy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182430/design-austauschbare-klassen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 22:33:12 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182430.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 24 May 2007 21:40:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Thu, 24 May 2007 21:40:53 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe eine bestehende Klasse Matrix, die ich gerne verwenden will und die auch alle Eigenschaften erfüllt, die ich momentan brauche. DAs Problem ist nur, dass die Klasse jederzeit durch eine andere Matrix-Klasse ersetzt werden soll, d.h. der Code sollte möglichst portabel sein.<br />
Ich steh jetzt ein wenig an, wie ich das am besten designen könnte? Gibt es eventuell Design-Patterns, die genau dieses Problem lösen. Ich denke ein Interface könnte eine Lösung sein. Und in anderen Klassen wird nur das Interface verwendet. Jede Matrix-Klasse muss dann aber wiederum dieses Interface implementieren..<br />
Vielleicht hat wer Tipps?<br />
Danke.</p>
<p>Gruß,<br />
Lemmy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291840</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291840</guid><dc:creator><![CDATA[Lemmy]]></dc:creator><pubDate>Thu, 24 May 2007 21:40:53 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Thu, 24 May 2007 21:51:01 GMT]]></title><description><![CDATA[<p>Viele Wege führen nach Rom.<br />
Die Klassen, die die Matrix nutzen wollen, können templates benutzen. Sie müssen dann zwar auch ein gewisses &quot;Interface&quot; einhalten, aber die Matrix-Klassen brauchen nichts vererben.</p>
<p>Aber auf ein Interface implementieren ist nicht falsch. Mach einfach eine abstrakte Klasse, ohne Implementierung und lasse alle Matrix-Klassen davon erben.</p>
<p>Oder du baust eine Adapterklasse.</p>
<p>Drei Varianten, die alle nicht falsch sind. Eine ultimative Lösung gibt es meiner Meinung nach nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291847</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Thu, 24 May 2007 21:51:01 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Thu, 24 May 2007 22:11:12 GMT]]></title><description><![CDATA[<p>Es gibt ein Muster (s.a.<a href="http://www.vico.org/pages/PatronsDisseny.html" rel="nofollow">http://www.vico.org/pages/PatronsDisseny.html</a>) das mir in den Sinn kommt:</p>
<p>- Bridge <a href="http://www.vico.org/pages/PatronsDisseny/Pattern%20Bridge/index.html" rel="nofollow">http://www.vico.org/pages/PatronsDisseny/Pattern%20Bridge/index.html</a></p>
<p>Das funktioniert in etwa so:</p>
<pre><code class="language-cpp">class AImpl {
public:
    opImpl(); 
};

class A {
public:
    op() { 
        this-&gt;pImpl-&gt;opImpl(); 
    ); 
private:
    AImpl* pImpl;  
};
</code></pre>
<p>Das trennt das Interface von seinen Implementierungen und ermöglicht es die Implementierungsklasse zur Laufzeit ändern!</p>
<p>Daüber hinaus natürlich das klassische Vorgehen Abstrakte Schnittstelle(Subskript-Operator,Addition,Multiplikation,Determinante,Spur,EW,EV)<br />
&lt;- Konkrete Imlemtentierung</p>
<p>Für einen synthetischen Subskript-Operator der Form [][] (direkt geht das nicht; es gibt keinen operator [][]) wäre es sinnvoll eine Rows-Klasse zu haben die ihrerseits [] überladt.</p>
<p>Grüsse</p>
<p>*this</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291854</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291854</guid><dc:creator><![CDATA[Gast++]]></dc:creator><pubDate>Thu, 24 May 2007 22:11:12 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Fri, 25 May 2007 02:21:22 GMT]]></title><description><![CDATA[<p>Nur zur Ergänzung: dieses Muster aka Pattern nennt man &quot;pimpl&quot; Pattern oder auch &quot;compilation firewall&quot;.<br />
(als &quot;compilation firewall&quot; wird es üblicherweise bezeichnet wenn man die Implementierung verstecken will damit man nicht immer so viel neu übersetzen muss wenn man daran was ändert -- das header File kann dann ja immer gleich bleiben)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1291872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1291872</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 25 May 2007 02:21:22 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Fri, 25 May 2007 22:42:06 GMT]]></title><description><![CDATA[<p>Danke für die Hinweise!</p>
<p>Artchi schrieb:</p>
<blockquote>
<p>[...]<br />
Oder du baust eine Adapterklasse.</p>
</blockquote>
<p>Adapterklasse klingt interessant, ich hab mich jetzt ein wenig eingelesen. Für das Adapter-Pattern verwendet man ja Target, Adapter und Adaptee.</p>
<p>Mit ist jetzt nicht ganz klar, wie das dann übertragen auf die o.a. Matrix-Klasse aussieht?</p>
<p>Gruß,<br />
Lemmy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292493</guid><dc:creator><![CDATA[Lemmy]]></dc:creator><pubDate>Fri, 25 May 2007 22:42:06 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Sat, 26 May 2007 09:57:24 GMT]]></title><description><![CDATA[<p>Ob für ne Matrix-Klasse oder String-Klasse ist eigentlich egal. Oder weißt du prinzipiell nicht, wie man das umsetzt??? Weil so schwer ist das ja nicht:</p>
<pre><code class="language-cpp">// Deine bisherige Matrix-Klasse:
class matrix_adapter
{
 public :
     // das bekannte und gewünschte Interface:
     virtual void foo() = 0;
     virtual void bar() = 0;
};
</code></pre>
<p>Und dann die fremden Klassen, die ein unbekanntes/inkompatibles Interface haben bzw. ausgetauscht werden sollen...</p>
<pre><code class="language-cpp">class matrix_hans
{
 public:
    void krass();
    void supi();
};

class matrix_stefan
{
    void voll_krass();
    void voll_supi();
};
</code></pre>
<p>Und die kannst du dann adaptieren:</p>
<pre><code class="language-cpp">class matrix_hans_adapter : public matrix_adapter
{
    matrix_hans matrix;
 public:
    void foo()
    {
       matrix.krass();
    }
    void bar()
    {
       matrix.supi();
    }
};
</code></pre>
<p>Für matrix_stefan dann so ähnlich.</p>
<p>Letztendlich benutzt du ja bereits eine Matrix-Klasse in deinem Projekt. Diese mußt du nicht unbedingt matrix_adapter umbenennen. Die lässt du so, wie sie ist. Mußt nur die Implementierung ändern (abstrakt machen). Und an den Stellen, wo die Matrix instanziert wird (entweder auf dem Stack oder durch ein new) mußt du dann natürlich die gewünschte spezielle Adapter-Klasse instanzieren. Das wars, der Rest deines Programms bleibt unverändert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292585</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Sat, 26 May 2007 09:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Sat, 26 May 2007 10:23:20 GMT]]></title><description><![CDATA[<p>Ok. Danke, alles klar!!</p>
<p>Gruß,<br />
Lemmy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292600</guid><dc:creator><![CDATA[Lemmy]]></dc:creator><pubDate>Sat, 26 May 2007 10:23:20 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Sat, 26 May 2007 14:25:17 GMT]]></title><description><![CDATA[<p>Hallo allerseits!</p>
<p>Jetzt ist noch eine Frage aufgetaucht:<br />
Ich brauche auch eine Adapterklasse für einen Vektor. Es ist so, dass ich derzeit LAPACK verwendet, wo die Vektoren von den Matrizen abgeleitet sind. Für meine Vektorklasse würde ich auch gerne von der bestehenden Matrix-Adapterklasse ableiten. Die Matrix-Adapterklasse hat LaGenMatDouble (aus LAPACK) als Membervariable. Der Vektor sollte eine Membervariable des Types LaVectorDouble (ist von LaGenMatDouble abgeleitet) haben.</p>
<pre><code class="language-cpp">Class Matrix : public MatrixInterface
{
private:
  LaGenMatDouble matrix_values_;
}

class Vector : public Matrix
{
private
  LaVectorDouble vector_values_;
}
</code></pre>
<p>Wenn ich ableite, hat die abgeleitete Klasse auch matrix_values_ als Membervariable. Das will ich eigentlich vermeiden, weil vector_values_ eh den gleichen Basistyp hat. Und ich dann immer beide Membervariablen ändern müsste, damit mir keine Daten verloren gehen. In anderen Worten: ich würde in der abgeleiteten Klasse auch gerne matrix_values_ verwenden, nur mit dem Datentyp LaVectorDouble.<br />
Ich hoffe, ich konnte mein Problem einigermaßen klar schildern.</p>
<p>Ich hab jetzt auch an Templates gedacht. Aber vom Client wird ja das MatrixInterface verwendet und ich will nicht jedesmal einen Typ mitangeben, weil ja dann das ganz wieder nicht mehr so portabel ist.<br />
Gibt es hier irgendeine Möglichkeit, um den Datentyp einer Membervariable in der abgeleiteten Klasse zu ändern? Oder um der Klasse Vector beizubringen, dass hier eben nicht LaGenMatDouble als Membervariablentyp verwendet werden soll, sondern LaVectorDouble.</p>
<p>Danke für Hinweise!</p>
<p>Grüsse,<br />
Lemmy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292663</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292663</guid><dc:creator><![CDATA[Lemmy]]></dc:creator><pubDate>Sat, 26 May 2007 14:25:17 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Sat, 26 May 2007 15:09:43 GMT]]></title><description><![CDATA[<p>Leite Vector vom MatrixInterface ab.</p>
<p>Du solltest bei deinem Design darauf achten es nicht auf eine Bibliothek festzulegen.<br />
Am besten implementierst du das ganze noch für eine andere Bibliothek um sicher zu gehen, dass es wirklich unabhängig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292679</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sat, 26 May 2007 15:09:43 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Sat, 26 May 2007 15:46:19 GMT]]></title><description><![CDATA[<p>Ok!<br />
Wie kann ich bei meinem Client, der MatrixInterface benutzt, eine lokale Matrix anlegen, die von MatrixInterface abgeleitet ist, aber deren genauer Typ noch nicht bekannt ist? Geht sowas nur mit einem Template oder gibt es noch andere Möglichkeiten? Es sollte erst zur Laufzeit feststehen, welche MatrixTyp nun wirklich verwendet wird.<br />
Das Problem bei der Template-Variante ist ja, dass man dann im Grunde jede x-beliebige Matrix einsetzen kann oder? Das sollte ja auch nicht sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292695</guid><dc:creator><![CDATA[Lemmy]]></dc:creator><pubDate>Sat, 26 May 2007 15:46:19 GMT</pubDate></item><item><title><![CDATA[Reply to Design - Austauschbare Klassen on Sat, 26 May 2007 16:26:24 GMT]]></title><description><![CDATA[<p>Dazu benutzt der Client Zeiger/Referenzen auf den Typ MatrixInterface und ein Matrix-Objekt lässt er von einer Factory erzeugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1292709</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1292709</guid><dc:creator><![CDATA[lolz]]></dc:creator><pubDate>Sat, 26 May 2007 16:26:24 GMT</pubDate></item></channel></rss>