繁体   English   中英

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

[英]How to use same reference to refer to more than one class

我需要将相同的数据发送给多个类。 我的教授给了我们一个半完成的驱动程序文件,他使用相同的引用来引用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));
    }
  }

}

看完作业后,我认为这是需要的:

你需要建立一个变量,它可以一个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");
...

它将根据将myGroceryList设置为myGroceryList对象来调用SortedStringListArrayBasedSortedStringListReferenceBasedadd方法。 这就是多态性-它在运行时根据实际类选择实际发生哪种add方法。

add调用(和其他调用)列表应仅在程序中出现一次。 但是,如果您想执行两次,对于每种类型的列表一次,则可以将其放入主程序调用两次的方法中。 或者,您可以使列表类型取决于args中的args ,然后运行该程序两次。 我不知道教授在那里想要什么。 但是该部分可以轻松更改。

基本上,UML图显示您有一个接口,然后有两个实现该接口的类,如箭头所示。 一个接口可以让您说“嘿,实现此接口的某些东西将具有这些方法,我将在接口代码中将其留空”接口是一种使实现类中的空值得以填充的方法)' 方法。 因此,您的教授为您提供了界面,由您决定每个班级应如何“添加”或“删除”某些内容? 如果椅子实现可移动接口,应该如何移动? 好吧,这取决于实现接口的类。 如果实现它的类是“ WheeledChair”,则move()可能是“推织补椅子”,但是如果实现了可移动接口,则“ WoodLeggedChair”可能就像“捡起它,所以您不要划地板!” 因此,您需要确定每种方法的实现方式。 这主要是接口的重点-当您知道实现接口的事物可能需要以彼此不同的方式处理数据时,定义一组空的方法或行为。 这样,您可以确保方法得到实现,但实现的细节对实现类开放

修改后的代码现在可以使用了。 不完全是我想做的,但是已经足够接近了。

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));
    }
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM