In Delphi sind müssen alle Interfaces von IInterface abgeleitet werden (dies ist ein Alias für IUnknown). Das ist oftmals sehr ärgerlich, Delphi lässt jedoch keine neuen Basis-Interfaces zu. Die Referenzzählung kannst du ausschalten, indem du in deinen Klassen _AddRef und _Release leer implementierst.
Die
GUID dient dazu Interfaces eindeutig zu identifizieren. In Delphi benötigst du die
GUID, um den as-Operator verwenden zu können, da dieser implizit QueryInterface verwendet, welches die
GUID des Zielinterfacetyps erwartet.
Bezüglich der Interface-Objekte: Die selbe Frage kannst du für abstrakte Klassen stellen und beantworten: Abstrakte Klassen und Interfaces müssen immer konkretisiert werden. In deinem Beispiel Verwendung von Interfaces natürlich nicht sinnvoll. Interessant wird es, wenn eine Routine mit Objekten arbeitet, die sie nicht selbst erstellt hat. Ein Binärbaum könnte zum Beispiel Objekte verwalten, die ein Interface IComparable implementieren (das lässt sich mit Generics noch weiter verbessern, aber das ist hier nicht das Thema): Dadurch kann der Binärbaum Vergleiche durchführen, aber ohne sich auf eine konkrete Klasse festzulegen.