2016-03-27 19 views
0

Ich habe vor kurzem eine Deck-Klasse (das ist die Super-Klasse) erstellt und ich versuche, eine Tester-Methode zu erstellen, um zu sehen, ob meine Klasse funktioniert. Hier ist mein Deck Klasse:Was ist falsch an der Unterklasse im Programm?

import java.util.List; 
import java.util.ArrayList; 

/** 
* The Deck class represents a shuffled deck of cards. 
* It provides several operations including 
*  initialize, shuffle, deal, and check if empty. 
*/ 
public class Deck 
{ 
/** 
* cards contains all the cards in the deck. 
*/ 
public static List<Card> cards; 

/** 
* size is the number of not-yet-dealt cards. 
* Cards are dealt from the top (highest index) down. 
* The next card to be dealt is at size - 1. 
*/ 
private int size; 
public static Card cardOne; 

/** 
* Creates a new <code>Deck</code> instance.<BR> 
* It pairs each element of ranks with each element of suits, 
* and produces one of the corresponding card. 
* @param ranks is an array containing all of the card ranks. 
* @param suits is an array containing all of the card suits. 
* @param values is an array containing all of the card point values. 
*/ 
public Deck(String[] ranks, String[] suits, int[] values) 
{ 
    for(int i=0; i<13;i++) 
    { 
     suits[i] = "Heart"; 
     ranks[i] = cardOne.rank(); 
     values[i] = cardOne.pointValue(); 
     cards.add(cardOne); 
    } 
    for(int i=0; i<13;i++) 
    { 
     suits[i] = "Spade"; 
     ranks[i] = cardOne.rank(); 
     values[i] = cardOne.pointValue(); 
     cards.add(cardOne); 
    } 
    for(int i=0; i<13;i++) 
    { 
     suits[i] = "Club"; 
     ranks[i] = cardOne.rank(); 
     values[i] = cardOne.pointValue(); 
     cards.add(cardOne); 
    } 
    for(int i=0; i<13;i++) 
    { 
     suits[i] = "Diamond"; 
     ranks[i] = cardOne.rank(); 
     values[i] = cardOne.pointValue(); 
     cards.add(cardOne); 
    } 

} 


/** 
* Determines if this deck is empty (no undealt cards). 
* @return true if this deck is empty, false otherwise. 
*/ 
public static boolean isEmpty() 
{ 
    if(cards.size()==0) 
     return true; 
    else 
     return false; 
} 

/** 
* Accesses the number of undealt cards in this deck. 
* @return the number of undealt cards in this deck. 
*/ 
public static int size() 
{ 
    return cards.size(); 
} 

/** 
* Randomly permute the given collection of cards 
* and reset the size to represent the entire deck. 
*/ 
public static List<Card> Shuffled[]; 
public void shuffle() 
{ 
    for(int i=0; i<52; i++) 
    { 
     cards.get(i); 

     int k=(int)(Math.random()*100); 
     while(k >52 || k<0) 
     { 
      k=(int)(Math.random()*100); 
     } 
     if(Shuffled[k]==null) 
      Shuffled[k]=(List<Card>) cards.get(i); 
    } 

} 

/** 
* Deals a card from this deck. 
* @return the card just dealt, or null if all the cards have been 
*   previously dealt. 
*/ 
public Card deal() 
{ 
    int cardDealed= (int)(Math.random()*100); 
    while(cardDealed >52 || cardDealed<0) 
    { 
     cardDealed=(int)(Math.random()*100); 
    } 
    Shuffled[cardDealed].remove(cardDealed); 

    return (Card) Shuffled[cardDealed]; 
} 

/** 
* Generates and returns a string representation of this deck. 
* @return a string representation of this deck. 
*/ 
@Override 
public String toString() 
{ 
    String rtn = "size = " + size + "\nUndealt cards: \n"; 

    for (int k = size - 1; k >= 0; k--) { 
     rtn = rtn + cards.get(k); 
     if (k != 0) { 
      rtn = rtn + ", "; 
     } 
     if ((size - k) % 2 == 0) { 
      // Insert carriage returns so entire deck is visible on console. 
      rtn = rtn + "\n"; 
     } 
    } 

    rtn = rtn + "\nDealt cards: \n"; 
    for (int k = cards.size() - 1; k >= size; k--) { 
     rtn = rtn + cards.get(k); 
     if (k != size) { 
      rtn = rtn + ", "; 
     } 
     if ((k - cards.size()) % 2 == 0) { 
      // Insert carriage returns so entire deck is visible on console. 
      rtn = rtn + "\n"; 
     } 
    } 

    rtn = rtn + "\n"; 
    return rtn; 
    } 
} 

Ich habe Probleme, herauszufinden, wie man zusammen die DeckTester Klasse setzen (die die Unterklasse ist). Bisher habe ich folgendes:

import java.util.List; 

/** 
* This is a class that tests the Deck class. 
*/ 
public class DeckTester extends Deck 
{ 
    public static List<Card> cards; 

    public DeckTester(String[] ranks, String[] suits, int[] values) 
    { 
     super(ranks, suits, values); 
    } 

    /** 
    * The main method in this class checks the Deck operations for consistency. 
    * @param args is not used. 
    */ 
    public static void main(String[] args) 
    { 

    } 
} 

Ich habe auch eine voll funktionsfähige Cards-Klasse. Ich bin mir nicht sicher, wie ich die Deck-Klasse überprüfen soll.

Antwort

1

Was ich sofort sagen kann, dass tested Klasse und tester Klasse zusammen mit composition nicht durch inheritance setzen.

So müssen Sie:

  1. Import tested Klasse tester
  2. erstellen Instanz tested Klasse
  3. ausführen einige Logik von tested Objekt
  4. Überprüfen Sie, ob es Ihre Erwartungen mit zB entspricht Junit oder TestNG
+0

Ich bin mir bewusst, dass ich das tun müssen, ist die Frage, Ich bin mir nicht sicher, wie ich das erreichen soll. – Pearlpoodle

+1

Nein, Sie wissen es nicht. 'DeckTester' erweitert' Deck' - völlig falsche Vorgehensweise –

1

Ich stimme Rudziankoŭ zu, die Verwendung von Testklassen mit Komposition wäre viel einfacher.

Ich werde nicht gehen in die Details über die verschiedenen Einstellungen, die Sie aber dies wäre ein Beispiel verwenden können (JUnit verwenden hier)

public class DeckTester { 

    /** 
     Check if deck size is being instantiated correctly 
    */ 
    @Test 
    public void testDeckSize() { 

     String[] ranks = new String[1]; // Not sure what this should be 
     String[] suits = new String[4]; 
     int[] vals = new int[12]; 
     Deck deck = new Deck(ranks, suits, vals); 
     assert deck.size() == 52; 
    } 

}