[英]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));
}
}
}
看完作业后,我认为这是需要的:
你需要建立一个变量,它可以是一个SortedStringListArrayBased
或SortedStringListReferenceBased
。 但是这两个都实现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
对象来调用SortedStringListArrayBased
或SortedStringListReferenceBased
的add
方法。 这就是多态性-它在运行时根据实际类选择实际发生哪种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.