Während einige Leute vorschlagen, Interfaces als "can-do" und nicht als "is-a" Beziehungen zu betrachten, denke ich, dass es hilfreicher ist, an sie zu denken "ist ein __er" oder "ist eine __able Sache". Um eine Analogie aus der realen Welt zu verwenden, sind ein Buch (eine Totholz-Ausgabe), ein gebundenes Papiermagazin, eine Zeitung, ein Werbungsflieger, ein Schild und ein Stück Papier mit einigen geschriebenen Worten alles "lesbare Dinge" ". Wenn jemand einer anderen Person ein Buch zeigen und fragen würde "Ist das eine lesenswerte Sache", wäre die Antwort, dass es so ist. Auf der anderen Seite, wenn jemand einer anderen Person ein Buch zeigen und fragen würde: "Was ist das?" die Antwort wäre nicht "Eine lesbare Sache", sondern eher "Ein Buch", oder vielleicht "Ein Hardcover-Fünfdruck-Kopie der zweiten US-Ausgabe des Romans" Great Expectations "von Charles Dickens". Jede Art von "lesbarem Ding" hat eine Identität, die nicht nur eine "lesbare Sache" ist.
Ebenso mit Java-Schnittstellen. Ein Objekt kann eine beliebige Anzahl von Schnittstellen implementieren, aber jedes Objekt muss einen Typ zusätzlich zu der Gruppe von Schnittstellen haben, die es unterstützt. Beachten Sie, dass es möglich ist, eine Methode zu definieren, die ein neues Objekt unbekannten Typs zurückgibt, das eine Schnittstelle implementiert; Das würde bedeuten, jemanden zu fragen: "Bitte, bring mir etwas zum Lesen", ohne zu spezifizieren, um was für ein Objekt es sich handelte. Eine solche Methode könnte einen Objekttyp auswählen, der zurückgegeben werden soll, und dem Anrufer ein "lesbares" geben. Konstruktoren erfordern jedoch im Gegensatz zu allgemeinen Methoden, dass der Aufrufer genau angibt, welcher Objekttyp gewünscht wird. Lediglich anzugeben, dass ein Objekt "lesbar" ist, wäre keine ausreichende Spezifikation.
Sicher, dass die ** Schnittstelle nicht instanziiert werden kann **? Was ist dann mit anonymer Klasse? –
@Quoi: Wie Sie selbst gesagt haben, anonyme Klasse - eine anonyme Implementierung einer Schnittstelle. –