Obwohl viele der anderen Antworten auf semantischer Ebene richtig sind, finde ich es interessant, diese Art von Fragen auch auf der Ebene der Implementierungsdetails zu beantworten.
Eine Schnittstelle kann als eine Sammlung von Slots betrachtet werden , die Methoden enthalten . Wenn eine Klasse eine Schnittstelle implementiert, muss die Klasse der Laufzeit mitteilen, wie alle erforderlichen Slots ausgefüllt werden sollen. Wenn du sagst
interface IFoo { void M(); }
class Foo : IFoo { public void M() { ... } }
Die Klasse sagt: "Wenn Sie eine Instanz von mir erstellen, geben Sie einen Verweis auf Foo.M in den Steckplatz für IFoo.M ein.
Wenn Sie dann einen Anruf tätigen:
IFoo ifoo = new Foo();
ifoo.M();
Der Compiler generiert Code mit der Aufschrift "Fragen Sie das Objekt, welche Methode sich im Steckplatz für IFoo.M befindet, und rufen Sie diese Methode auf.
Wenn eine Schnittstelle eine Sammlung von Slots ist, die Methoden enthalten, können einige dieser Slots auch die Methoden get und set einer Eigenschaft, die Methoden get und set eines Indexers sowie die Methoden add und remove eines Ereignisses enthalten. Aber ein Feld ist keine Methode . Einem Feld ist kein "Slot" zugeordnet, den Sie dann mit einem Verweis auf die Feldposition "ausfüllen" können. Daher können Schnittstellen Methoden, Eigenschaften, Indexer und Ereignisse definieren, jedoch keine Felder.