如何使用相同的引用来引用多个类

时间:2014-03-07 20:59:06

标签: java

我需要将相同的数据发送到多个班级。我的教授给了我们一个半完成的驱动文件,他使用相同的引用来引用2个不同的类,这样你就可以在一个方法调用中将相同的数据发送到两个类。但是这会导致错误。我一直试图让它工作,即使给他们不同的参考和调用方法两次但它仍然无法工作。它还说它找不到符号“SortedStringListReferenceBased_solution”,这是方法的签名。请帮忙。

 public class SortedStringListDriver
{

  public static void main(String [] args)
 {
    SortedStringListArrayBased myGroceryList = new SortedStringListArrayBased();
    SortedStringListReferenceBased myGroceryList = new SortedStringListReferenceBased();

    myGroceryList.add("milk");
    myGroceryList.add("eggs");
    myGroceryList.add("butter");
    myGroceryList.add("pecans");
    myGroceryList.add("apples");
    myGroceryList.add("bread");
    myGroceryList.add("chicken");
    myGroceryList.add("black beans");
    myGroceryList.add("rice");
    myGroceryList.add("sausage");
    myGroceryList.add("flour");

    printList(myGroceryList);//print out original List
    System.out.print("numItems for array based list is now: "+myGroceryList1.size()+"\n\n");


    adding(myGroceryList, "juice");
    removing(myGroceryList, "juice");
    adding(myGroceryList, "banana");
    removing(myGroceryList, "sausage");
    removing(myGroceryList, "cheese");

    }

   public static void adding(SortedStringListReferenceBased_solution myList, String str)
   {
    System.out.println("Adding " + str + " ...");
    myList.add(str);  //add juice
    printList(myList);
    System.out.print("numItems for array based list is now: " + myList.size() + "\n\n");
  }

  public static void removing(SortedStringListReferenceBased_solution myList, String str)
  {
    System.out.println("Removing " + str + " ...");
    myList.remove(str);
    printList(myList);
    System.out.print("numItems is now: " + myList.size() + "\n\n");
  }

  public static void printList(SortedStringListReferenceBased_solution myList)
  {
   //method prints a list, numbering the values,  e.g, "0.  milk" .... "4.  juice".... etc.
    for (int index = 0; index < myList.size(); index++)
    {
      System.out.printf("%2d. %s\n",index, (String) myList.get(index));
    }
  }

}

3 个答案:

答案 0 :(得分:0)

在查看作业后,我认为这就是所需要的:

您需要设置一个可以 SortedStringListArrayBasedSortedStringListReferenceBased的变量。但这两个都实现SortedStringListInterface,因此您的变量将被声明为SortedStringListInterface。您可以将变量分配给其中一个。

SortedStringListInterface myGroceryList;
if (iWantAnArray)  // I have no idea how to determine this
    myGroceryList = new SortedStringListArrayBased();
else
    myGroceryList = new SortedStringListReferenceBased();

请注意,当您将myGroceryList声明为SortedStringListInterface时,这意味着该变量可以引用实现该接口的任何对象,无论它是什么类。这可能是您主题专栏中问题的答案。

完成后,您可以添加商品:

myGroceryList.add("milk");
myGroceryList.add("eggs");
...

它会调用addSortedStringListArrayBased的{​​{1}}方法,具体取决于您为SortedStringListReferenceBased设置的对象类型。这是多态性 - 它在运行时根据实际类选择实际发生myGroceryList方法。

add来电(以及其他来电)列表只应在您的计划中出现一次。但是如果你想要两次,每种类型的列表一次,你可以将它放在主程序调用两次的方法中。或者您可以使列表类型取决于add中的参数,并运行程序两次。我不知道教授想要什么。但是那部分可以很容易地改变。

答案 1 :(得分:0)

基本上,UML图表显示您有一个接口,然后是两个实现接口的类,由箭头指示。一个接口让你说“嘿,实现这个接口的东西将有这些方法,我将在接口代码中留空”接口是一种方法,使空的待填充实现类(es )' 方法。所以你的教授给你了界面,由你来决定每个课程应该“添加”或“删除”某些内容?如果椅子实现了可移动的界面,它应该如何移动?那取决于实现接口的类。如果实现它的类是“WheeledChair”,那么move()可能是“推动darn chair”,但是如果它实现了可移动界面,那么“WoodLeggedChair”可能就像“捡起它,所以你不要刮掉地板!”因此,您需要决定如何在每个方法中实现这些方法。这主要是一个接口 - 当你知道实现接口的东西可能需要以不同于彼此的方式处理数据时,定义一组空的方法或行为。这样您就可以确保实现方法,但是将实现的细节留给实现类

答案 2 :(得分:0)

现在可以修改的代码。不完全是我想做的,但它足够接近。

public class SortedStringListDriver
{

  public static void main(String [] args)
  {
    SortedStringListArrayBased myGroceryList1 = new SortedStringListArrayBased();
    SortedStringListReferenceBased myGroceryList2 = new SortedStringListReferenceBased();

    myGroceryList1.add("milk");
    myGroceryList1.add("eggs");
    myGroceryList1.add("butter");
    myGroceryList1.add("pecans");
    myGroceryList1.add("apples");
    myGroceryList1.add("bread");
    myGroceryList1.add("chicken");
    myGroceryList1.add("black beans");
    myGroceryList1.add("rice");
    myGroceryList1.add("sausage");
    myGroceryList1.add("flour");

    myGroceryList2.add("milk");
    myGroceryList2.add("eggs");
    myGroceryList2.add("butter");
    myGroceryList2.add("pecans");
    myGroceryList2.add("apples");
    myGroceryList2.add("bread");
    myGroceryList2.add("chicken");
    myGroceryList2.add("black beans");
    myGroceryList2.add("rice");
    myGroceryList2.add("sausage");
    myGroceryList2.add("flour");

    printList(myGroceryList1);
    printList(myGroceryList2);//print out original List
    System.out.print("numItems for array based list is now: " + myGroceryList1.size() + "\n");
    System.out.print("numItems for referenced based list is now: " + myGroceryList2.size() + "\n\n");

    adding(myGroceryList1, "juice");
    adding(myGroceryList2, "juice");
    removing(myGroceryList1, "juice");
    removing(myGroceryList2, "juice");
    adding(myGroceryList1, "banana");
    adding(myGroceryList2, "banana");
    removing(myGroceryList1, "sausage");
    removing(myGroceryList2, "sausage");
    removing(myGroceryList1, "cheese");
    removing(myGroceryList2, "cheese");
  }

  public static void adding(SortedStringListInterface myList, String str)
  {
    System.out.println("Adding " + str + " ...");
    myList.add(str);  //add juice
    printList(myList);
    System.out.print("numItems for array based list is now: " + myList.size() + "\n\n");
  }

  public static void removing(SortedStringListInterface myList, String str)
  {
    System.out.println("Removing " + str + " ...");
    myList.remove(str);
    printList(myList);
    System.out.print("numItems is now: " + myList.size() + "\n\n");
  }

  public static void printList(SortedStringListInterface myList)
  {
    //method prints a list, numbering the values,  e.g, "0.  milk" .... "4.  juice".... etc.
    for (int index = 0; index < myList.size(); index++)
    {
      System.out.printf("%2d. %s\n\n",index, (String) myList.get(index));
    }
  }

}