Templates und Interfaces



  • Hi Volkz!

    Ist es legal Interfaces und Templates miteinander zu verbinden? Ich sell mir das grade so vor:

    template<class T> class IBuffer
    {
    public:
    	/** Hier die Methoden. */
    	virtual T* Lock(unsigned int Offset, unsigned int Length) = 0;
    	virtual void Unlock() = 0;
    };
    
    template<class T> class Buffer : public IBuffer<T>
    {
    public:
    	T* Lock(unsigned int Offset, unsigned int Length) 
    	{
    		return new ...
    	}
    
    	void Unlock()
    	{
    		delete[] ...
    	}
    };
    

    Wenn ja, wie nutzt man soetwas richtig, nicht das ich irgent etwas nicht beachte.



  • Mhh ich versteh nicht so ganz was du meinst.
    Also ein Klassentemplate hat genau wie ne normale Klasse logischweise auch ein Interface( Schnittstelle ).

    Ich kann leider nicht herauslesen was du jetzt wissen willst.
    Du hast ja ein abstrakes Klassentemplate erstellt und davon ein Klassentemplate abgeleitet.

    Stell am besten die Frage vielleicht verständlicher, oder ich bin zu blöd[list] 😋

    Lg freeG



  • Ich kanns ja ma versuchen 😉

    Kann ich IBuffer nun in eine DLL packen, und nur das Interfaces soll bekannt sein, für den Nutzer? Ich mein, muss das Programm dann nicht wissen wie Buffer aufgebaut ist, um dann die nätigen ableitungen daraus zu bilden?

    Naja, werd wohl einfach auf memcpy etc... setzen ^^


  • Mod

    Potatoman schrieb:

    Kann ich IBuffer nun in eine DLL packen, und nur das Interfaces soll bekannt sein, für den Nutzer? Ich mein, muss das Programm dann nicht wissen wie Buffer aufgebaut ist, um dann die nätigen ableitungen daraus zu bilden?

    Nein das geht nicht, Templates funktionieren nicht so. Die Definitionen müssen zur Compilezeit bekannt sein.



  • Ist es legal Interfaces und Templates miteinander zu verbinden? Ich sell mir das grade so vor:

    Ja, das kannst Du machen.

    Kann ich IBuffer nun in eine DLL packen, und nur das Interfaces soll bekannt sein, für den Nutzer? Ich mein, muss das Programm dann nicht wissen wie Buffer aufgebaut ist, um dann die nätigen ableitungen daraus zu bilden?

    Ja, genau. Dabei musst Du aber beachten, dass Du nur eine Instantierung deines Klassen Templates (IBuffer<..>) "exportieren" kannst. Zum Zeitpunkt der Kompilation der DLL muss ja der Template Parameter festgelegt sein.

    Zusätzlich brauchst Du noch eine Factory um den Benutzer von IBuffer<..> wirklich von der Implementation Buffer<..> zu entkoppeln.

    Zusammengefasst: Alles genauso wie ohne Template (Interface / Implementation / Factory). Kommen Templates hinzu, geht das, jedoch müssen sie zur Compile Time der DLL feststehen.

    Simon



  • Du kannst natürlich Klassen in eine DLL packen, die ein aus IBuffer konkretisiertes Interface implementieren. IBuffer selbst muss, da es eine Klassenvorlage ist, dem benutzenden Code vollständig bekannt sein, aber wenn ich richtig verstehe, was du da vorhast, ist damit der einzige Unterschied zu "normalen" Interfaces, dass du den virtuellen Destruktor (den du im Codebeispiel übrigens vergessen hast) in den Header schreiben musst.


Anmelden zum Antworten