Interface



  • Was sind Interfaces, wozu werden sie gebraucht und was ist der Vorteil gegenüber Klassen?



  • Ein Interface ist eine Definition einer Schnittstelle.

    zB koennte man ein Interface 'Streamable' erfinden, welches eine Schnittstelle bereit stellt um Daten an cout auzugeben:

    struct Streamable
    {
      virtual void writeAt(ostream& stream) const = 0;
    };
    
    ostream& operator<<(ostream& stream, Streamable const& obj)
    {
      obj.writeAt(stream);
      return stream;
    }
    

    Dies ist das Interface. Um es in einer Klasse zu implementiert muss man nur noch writeAt definieren:

    class Test : public Streamable
    {
    private:
      int i;
    public:
      Test(int i) : i(i) {}
    
      void writeAt(ostream& stream) const
      {
        stream<<i;
      }
    };
    

    In C++ gibt es von der Syntax her keinen Unterschied zwischen einer Klasse und einem Interface, in anderen Sprachen (Java, C#,...) schon.



  • #include <iostream>
    using namespace std;
    
    struct Streamable; 
    class Test;
    
    int main()
    {
        Test test(1);
        cout << test;
    }
    
    struct Streamable 
    { 
      virtual void writeAt(ostream& stream) const = 0; 
    }; 
    
    class Test : public Streamable 
    { 
      friend class std::ostream; 
      private: 
        int i_; 
      public: 
        Test( int i ) : i_(i) {} 
    
        void writeAt( ostream& stream ) const 
        { 
          stream << i_; 
        }
    };
    
    ostream& operator<<( ostream& stream, Streamable const& obj ) 
    { 
        obj.writeAt( stream ); 
        return stream; 
    }
    

    Compiler motzt: 'Test test' has initializer but incomplete type
    Was fehlt da noch?



  • Wenn du

    struct Streamable;  
    class Test;
    

    entfernen und die main-Fkt. nach unten schieben würdest, würde sich der Code zumindest kompilieren lassen... 🙂



  • Ist ein Interface nicht einfach eine abstrakte Basisklasse oder irre ich mich jetzt wieder völlig?



  • wer hat was anderes behauptet?



  • Nein, aber in welchem Zusammenhang steht das mit einer Schnittstelle denn? 🙂



  • Bei der ursprünglichen Konzeption von JAVA verzichtete man auf Mehrfachvererbung, weil man sie nicht brauchen würde und sie die Programme nur kompliziert machen würde (ausserdem ist es für einen "Interpreter" auch schwer, Mehrfachvererbung zu handeln 😉 ). Schnell zeigte sich, dass dieses ein Fehler war, und so führte man kurzerhand die Interfaces ein. Im Sinne von C++ sind dieses tatsächlich nur 100% abstrakte Klasse (ohne jegliche Implementation, also nur pure- virtuelle Methoden, keine Member). Da auch C# nichts anderes ist, als die stark erweiterte und verbesserte Java- Implementierung von Microsoft (die ja gerichtlich untersagt wurde) taucht auch bei C# dieser Begriff so auf. Allerdings können Interfaces keine Mehrfachvererbung und entsprechende Architekturen ersetzen.

    Ursprünglich kommt der Begriff Interface aber eher von verteilten Objekten und damit auch von COM. Auch hier sind Interfaces abstrakt, sie werden hier über eine unabhängige Beschreibung (idl) beschrieben, diese werden dann auf verschiedene Weise später genutzt.


Log in to reply