Autor Beitrag
Oppi35
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 95
Erhaltene Danke: 3



BeitragVerfasst: Fr 07.05.10 16:23 
Hallo zusammen,

ich bin bisher immer davon ausgegangen, dass man mit Interfaces die Möglichkeit hat, eine neue Klasse mit einer bereits programmierten Schnittstelle zu befüllen, also dem Grundgerüst. Also z.b. so:

class Test : IFormatter

Das "Gerüst" des Interfaces IFormatter steht somit in der Klasse Test zur Verfügung.
In einem Webcast auf der Microsoft Homepage habe ich allerdings folgende Verwendung eines Interfaces gesehen. Hier verstehe ich die Verwendung eines Interfaces nicht. Die folgende Codezeile stammt aus einem Webcast zum Thema Serialisierung:

IFormatter formatterout = new BinaryFormatter();

In diversen Büchern und auch von meinem logischen Verständnis lautet die Zeile richtig:

BinaryFormatter formatterout = new BinaryFormatter();

Ich habe es ausprobiert. Beide Versionen funktionieren.

FRAGE: Warum wird formatterout in dem Webcast vom Typ IFormatter gebildet? IFormatter ist doch keine Klasse, sondern ein Interface. Was passiert da im Hintergrund?

Vielen Dank für Eure Hilfe.
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Fr 07.05.10 16:41 
Hallo,

die folgende Formulierung passt nur sehr bedingt:
user profile iconOppi35 hat folgendes geschrieben Zum zitierten Posting springen:
dass man mit Interfaces die Möglichkeit hat, eine neue Klasse mit einer bereits programmierten Schnittstelle zu befüllen, also dem Grundgerüst.

Eine Schnittstelle ist "nur" ein Vertrag, dass bestimmte Bedingungen gegeben sind. Eine Klasse, die "von einer Schnittstelle abgeleitet" (äußerst unsaubere Formulierung) ist, verpflichtet sich, diesen Bedingungen zu entsprechen. "bereits programmiert" ist also nur die Deklaration von Eigenschaften und Methoden, aber nicht deren Implementation; das ist Sache der Klasse.

Auf dieser Grundlage ist der von dir genannte Code zu verstehen:
user profile iconOppi35 hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden C#-Quelltext
1:
IFormatter formatterout = new BinaryFormatter();					

Die Variable formatterout erfüllt die Bedingungen der Schnittstelle IFormatter. Gleichgültig um welche Klasse es sich wirklich handelt: Der Compiler kann sicher sein, dass die Eigenheiten der Schnittstelle vorhanden und in der Klasse implementiert sind, und er kann deshalb damit arbeiten.

In diesem Zusammhang: Es ist auch so etwas möglich:
ausblenden C#-Quelltext
1:
2:
MainForm frm = new MainForm();
Control ctrl = frm;

Da Form von Control abgeleitet ist, funktioniert die Zuweisung. Mit der Variablen ctrl können aber nur Eigenschaften von Control genutzt werden, aber keine von MainForm (obwohl intern weiterhin bekannt ist, dass es sich um ein Hauptformular handelt). Erst mit der folgenden Zuweisung hast du wieder Zugriff auf die MainForm-Spezialitäten:
ausblenden C#-Quelltext
1:
MainForm form2 = ctrl as MainForm;					

Ich weiß, dass das Denken mit Interface etwas Gewöhnung braucht. Es macht aber manches einfacher, vor allem bei Zuweisungen oder Verwendung eines bestimmten Objekts in verschiedenen Zusammenhängen.

Gruß Jürgen