2016-10-02 4 views
3

Ich erstelle ein einfaches Spiel des Krieges mit Karten für meine Datenstrukturen Klasse.Liste <E> Implementierungen

Ich habe derzeit ein Verfahren wie folgt:

Play Turn(List<Card> player1, List<Card> player2){ 
    return null; 
} 

Das obige Verfahren (was ich verstehen unvollständig zur Zeit ist) ist wohl jede Subschnittstelle der Liste Schnittstelle zu übernehmen (dh Stapel, Arraylist, LinkedList, usw.).

Der Stapel verwendet pop(), um den Anfang des Stapels zurückzugeben/zu entfernen, und so etwas wie eine ArrayList oder LinkedList Ich kann die Methode get() verwenden, um das erste Element und dann die remove() -Methode zurückzugeben Element.

Also gibt es eine Möglichkeit, dass ich dies auf generische Weise tun kann, oder muss ich eine Methode erstellen, die auf jede Version der Liste zugeschnitten ist, die ich verwenden darf?

+1

'Stack',' ArrayList', ..., implementieren alle die 'List' Schnittstelle Methoden (wie' get', 'remove', ...), so dass Sie nur diese für alles verwenden können ... warum Verwenden Sie die spezifischen 'Stack'-Methoden (wie' Pop'), wenn Sie nicht müssen? – BalinKingOfMoria

+0

Sie benötigen keine separaten Implementierungen, wenn Sie Ihre Implementierungen auf List-Methoden beschränken. Wenn Sie sich vorstellen, dass Sie den zugrunde liegenden Typ kennen müssen, denken Sie noch einmal darüber nach. – duffymo

+0

Das beantwortet meine Frage. Ich hatte den Eindruck, dass ich, obwohl ich den 'Stack' unter der 'List'-Schnittstelle benutzte, die Methoden wie' Pop 'im Vergleich zu Methoden wie' Holen 'und' Entfernen 'benutzen müsste. – Ryley6905

Antwort

1

Bitte lesen und befolgen Sie die Java-Codierungsstandards (Google oder Sun/Oracle). Ihr Code ist ohne sie weniger verständlich.

Ihre Methode sollte wie folgt aussehen:

Play turn(List<Card> player1, List<Card> player2) { 
    return null; 
} 

Die Bedeutung ist klar: Sie alle Verweise auf dem Heap zu einem Object passieren kann, der die List-Schnittstelle implementiert. Dies bedeutet, dass Ihre Implementierung nur Methoden in der List Schnittstelle aufrufen sollte. Sie sollten sich nicht mit der konkreten Umsetzung der Ihnen gegebenen Referenz befassen.

Ich verstehe nicht, wo Stack spielt in dieser Schnittstelle. A Stack könnte mit einem List implementiert werden, aber seine Methoden (Push, Pop, Peek) sind nicht Teil der List Schnittstelle. Sie sind für die Parameter in Ihrer Schnittstelle gesperrt.

Wenn Sie glauben, dass Ihre Methoden für jeden Player eine Stack<Turn> benötigen, dann sollten Sie keinen List als Parameter haben.

+0

Sollte zwischen ')' und '{'? (Ich bin nicht ganz sicher, was die Java-Codierungsstandards sind, da ich hauptsächlich ein C# -Typ bin, aber das Beispiel, das ich gesehen habe, folge dem ersten Format ....) – BalinKingOfMoria

+0

Ich beziehe mich auf den Methodennamen - es sollte abbiegen, nicht abbiegen. Ich hätte einen Abstand zwischen den beiden. Sie setzen die geschweifte Klammer an der richtigen Stelle: am Ende der Methodendeklaration, nicht in der nächsten Zeile. – duffymo

+1

Ich lerne immer noch alle Standards, da ich erst im zweiten Jahr bin, also entschuldige ich mich für die Fehler, die ich gemacht habe. – Ryley6905

0

Jede Klasse, die die List Schnittstelle implementiert, wird eine Reihe von Versprechungen darüber machen, was passiert, wenn die List Methoden aufgerufen werden. Sie können die Versprechen auf andere Weise erfüllen, aber die Versprechen werden bei allen Implementierungen eingehalten.

Zum Beispiel gibt ein Aufruf an get(0) auf einer beliebigen Implementierung von List das erste Element in der Liste zurück. Dies gilt unabhängig davon, ob Sie eine ArrayList, eine LinkedList, eine Stack oder eine JoesCustomList verwenden. Es besteht daher keine Notwendigkeit, Ihre Methode für verschiedene Arten von Listen anzupassen.

0

Im Gegenteil: wenn Sie nicht wirklich gute Gründe haben, möchten Sie unbedingt jede Art von downcast vermeiden! Jede Art von instanceof-check und downcast auf eine konkrete Implementierung der List-Schnittstelle ist etwas, das Sie nicht in Ihrem Code haben wollen!

Bedeutung: Einer der Hauptvorteile dieser Schnittstellen ist die Tatsache, dass sie bereits die Methoden enthalten, die Sie aufrufen müssen.

Mit anderen Worten: Einer der Schlüsselwerte solcher Schnittstellen ist die Tatsache, dass die Schnittstelle allein jene Methoden liefert, die man braucht, um die Arbeit zu erledigen. Sie bieten eine leistungsstarke Abstraktion, die Ihren Code völlig agnostisch auf die Frage "wie ist diese Schnittstelle tatsächlich implementiert!"

Verwandte Themen