帮助一个功能

时间:2010-02-18 03:48:59

标签: java

我正在尝试从main()添加信息 到一个项目类,我将信息存储在3个不同的哈希集

我有3个班级

  1. project - main()

  2. libaray - addBandMembers函数

  3. 项目 - addband(字符串...成员)

  4. 我正在添加CD信息。

    首先,我添加乐队,歌曲#,标题 - 这很好用

    我遇到问题的地方是加入乐队成员..

    我想我需要将musicCD对象转换为CD类然后调用 addband功能?

    我只是不确定该怎么做。

    以下是我认为您需要帮助我的代码部分..

    这就是我所拥有的:

    main()的

    item = library.addMusicCD("Don't Let Go", "Jerry Garcia Band", 15, "acid rock", "jam bands");
    if (item != null) {
    library.addBandMembers(item, "Jerry Garcia", "Keith Godcheaux");
    library.printItem(out, item);
    }
    

    然后,这里是第一个叫做..

    的函数

    这是我需要帮助的地方!!!!

    public void addBandMembers(Item musicCD, String... members)
    {
    
    //musicCD.addband(members);   // both cant find addband function..
     //Item.addband(members);
    
    }
    

    然后在另一个班级我试图添加信息..

     private String [] members;  
    
    
    public void addband(String... member)
    {
        this.members = member; 
    
    }
    
    哦,你好,这是我的套装..

    public class Library
    {
    private Set<CD> theCDs = new HashSet<CD>();
    private Set<DVD> theDVDs = new HashSet<DVD>();
    private Set<Book> theBooks = new HashSet<Book>();
    

    所以,从函数public void addBandMembers() 我想添加成员到addband

    我的addband函数错了吗?

    我确实有C ++的背景,我正在尝试将我所知道的应用到java中,所以请你好。我知道我有更多的评论要做,我只是无法在网上找到我需要的东西.. 谢谢..

3 个答案:

答案 0 :(得分:0)

在这个问题上有很多事情没有意义。添加建议增加集合中的项目数。所以addBandMembers应该意味着你要将Band成员添加到乐队。所以我希望有一个包含该方法的Band类。它应该看起来像addBandMembers(Set<BandMember> bandMembers)你的addMusicCD是一个可以接受的方式将一个项目添加到一个集合,但是每个参数需要一些值,因此你可能只需要一张CD,其构造函数可以具有所需的特定参数。

我建议您的媒体的基类可能称为媒体,可能具有Band属性以及所有类型的媒体共有的所有其他基本属性。然后,您可以继承CD,DVD和Book类中的媒体类,并为这些媒体类型添加特定属性。

这应该让你开始。

答案 1 :(得分:0)

如果通过

//musicCD.addband(members);   // both cant find addband function..
 //Item.addband(members);

你的意思是它不会编译,那么可能是你拥有的其他类

 private String [] members;  


    public void addband(String... member)
    {
        this.members = member; 

    }

不是Item类。这就是为什么musicCd.addband(members)无效,因为musicCDItem。由于Item.addband(members)不是addband方法,因此static无效。

如果我理解正确,addband课程中就会出现CD方法。你应该有这样的东西让它发挥作用。

注意:如果你的15是CD价格,那么你应该考虑使用BigDecimal而不是int,double或者你正在使用的任何东西。如果是其他内容,则更改BigDecimal for和int / double及其相应的参数名称。

另外,我假设out参数是PrintStream

import java.math.BigDecimal;

public class Main {

    public static void main(String[] args) {


        Band band = new Band("Jerry Garcia Band");
        band.addMember("Jerry Garcia");
        band.addMember("Keith Godcheaux");

        MusicCD cd = new MusicCD("Don't Let Go", band, new BigDecimal(15),
                "acid rock", "jam bands");

        Library library = new Library();
        library.addMusicCD(cd);

        library.printItem(System.out, cd);

    }

}

public interface Item {

}

public class Book implements Item {

}


public class DVD implements Item {

}

public abstract class CD implements Item{

    private String title;
    private BigDecimal price;
    private String information;

    public CD(String title, BigDecimal price, String information) {
        this.title = title;
        this.price = price;
        this.information = information;
    }

}

import java.util.HashSet;
import java.util.Set;

public class Band {

    private Set<String> members;
    private String name;

    public Band(String name) {
        this.members = new HashSet<String>();
    }

    public void addMember(String member) {
        members.add(member);
    }

}

import java.io.PrintStream;
import java.util.HashSet;
import java.util.Set;

public class Library {
    private Set<CD> theCDs = new HashSet<CD>();
    private Set<DVD> theDVDs = new HashSet<DVD>();
    private Set<Book> theBooks = new HashSet<Book>();

    public void addMusicCD(MusicCD cd) {
        theCDs.add(cd);
    }

    public void printItem(PrintStream out, Item item) {
        out.print(item);
    }

}

我确信可以添加内容。我试着不改变它,所以你可以理解需要什么。

答案 2 :(得分:0)

您需要解决几个问题...

首先,在addBandMembers()中,如果找不到musicCD.addB,那么你需要为Item定义addBand()方法,或者根据你的对象找到具有addBand()方法的相应类可以从Item访问。

其次,您需要了解类方法和对象方法之间的区别。由“static”关键字标识的类方法以对该类的所有实例化对象共享的方式对基类进行操作。例如,static foo(x){ this.x = x; }将设置类的静态“x”变量,对“x”变量的任何访问都将使用调用foo()的最后一个设置值(假设没有其他方法来设置x)。因此,如果你有object1和object2,那么定义foo,object1.x和object2.x的类都将是内存中的相同位置,两者都在调用foo()时同时设置。由明显缺少的“static”关键字标识的实例变量共享。 public bar(y){ this.y = y; }将在内存中为类的每个对象设置一个不同的位置 - object1.y将是一个不同的内存位置,并且(可能)与object2.y不同。

第三,“Item”是一个相当不具描述性的名称。您的图书馆是否始终用于音乐,或者您是否需要更通用?将类重命名为LibraryItem或Media(如另一个答案所示)将澄清您的代码。

第四,你没有提供足够的信息来真正诊断正在发生的事情。当你请求帮助时,你应该提供相关的输出(在main的末尾打印什么?),定义相关变量/函数的类(addband()和addBandMembers()函数定义在哪里?)和任何错误消息(当你取消注释addband()中的任何一行时,你会得到什么错误?)。通过完整的信息,人们可以更轻松地提供帮助。没有完整的信息,人们通常不可能给出真正好的答案。

第五,你谈到铸造Object,但提到你不知道怎么做。使用Java进行转换与使用C ++进行转换非常相似:Foo myFoo = (Foo)myBar;。如果myBar不是myFoo 的子类并且 myFoo不是myBar的子类,那么在运行时会得到ClassCastException。请注意,您不需要将子类强制转换为超类,因为JVM已经知道类层次结构,就像编译器在C ++中所知道的那样。 Java中的所有类都继承自Object,因此几乎不需要转换为Object。另一方面,如果你碰巧有一个Item的子类,其中定义了addband(),你可以将item(在main中)转换为适当的子类,并在casted对象上调用addband()方法。

 
CompactDisk cd = (CompactDisk)item;
cd.addband(...);

或者您可以将其作为单行

进行
((CompactDisk)cd).addband(...);

如果您需要多次将对象用作CompactDisk,则第一个将非常有用。第二个是可以接受的,如果你只需要施放一次,也许两次彼此相邻 - 超过这个,会产生可读性和维护问题。