помочь с функцией - PullRequest
       1

помочь с функцией

0 голосов
/ 18 февраля 2010

Я пытаюсь добавить информацию из main () в класс предметов, где я храню информацию в 3 разных хэш-наборах

у меня есть 3 класса

  1. проект - основной ()

  2. libaray - функция addBandMembers

  3. Item - addband (String ... member)

Я добавляю информацию о 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 голосов
/ 18 февраля 2010

Если под

//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) не будет работать, поскольку musicCD является Item.Item.addband(members) не будет работать, поскольку addband не является методом static.

Если я правильно понял, метод addband относится к вашему классу CD.У вас должно быть что-то вроде этого, чтобы оно работало.

Примечание. Если вы стоите за CD, то вам следует рассмотреть возможность использования BigDecimal вместо int, double или чего-либо еще, что вы используете.Если это было что-то еще, то измените BigDecimal для и int / double и его имя соответствующего параметра.

Кроме того, я предположил, что выходной параметр был 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);
    }

}

ЯКонечно, вещи могут быть добавлены к этому.Я старался не менять это много, чтобы вы могли понять, что было нужно.

0 голосов
/ 18 февраля 2010

Похоже, вам нужно решить несколько проблем ...

Во-первых, в addBandMembers (), если он не может найти musicCD.addBand, вам нужно либо определить метод addBand () для Item, либо найти соответствующий класс, который имеет метод 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.

В-третьих, «Предмет» - это довольно неописательное имя. Ваша библиотека всегда предназначена для музыки, или вам нужно быть более универсальным? Переименование класса в LibraryItem или Media (как предложено в другом ответе) прояснит ваш код.

В-четвертых, вы не предоставили достаточно информации, чтобы действительно диагностировать происходящее. Когда вы обращаетесь за помощью, вы должны предоставить соответствующие выходные данные (что печатается в конце main?), Классы, в которых определены соответствующие переменные / функции (где определены функции addband () и addBandMembers ()?), И любые сообщения об ошибках. (какую ошибку вы получаете, когда вы раскомментируете любую строку в addband ()?). С полной информацией людям намного легче помочь. Без полной информации люди часто не могут дать действительно хорошие ответы.

В-пятых, вы говорите о касте на Object, но упоминаете, что не знаете как. Приведение в Java очень похоже на приведение в C ++: Foo myFoo = (Foo)myBar;. Вы получите ClassCastException во время выполнения, если myBar не является подклассом myFoo , а myFoo не является подклассом myBar. Обратите внимание, что вам не нужно приводить подклассы к их суперклассам, так как JVM уже знает иерархию классов, точно так же, как компилятор знает в C ++. Все классы в Java наследуются от Object, поэтому почти никогда нет необходимости приводить их к Object. С другой стороны, если у вас есть подкласс Item, в котором определена функция addband (), вы можете привести элемент (в основном) к соответствующему подклассу и вызвать метод addband () для приведенного объекта.

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

или вы можете сделать это как однострочник как

((CompactDisk)cd).addband(...);

Первый будет полезен, если вам нужно использовать объект как компакт-диск более одного раза. Второй вариант будет приемлемым, если вам нужно привести только один раз, может быть, два рядом друг с другом - более того, это создает проблемы с читаемостью и обслуживанием.

0 голосов
/ 18 февраля 2010

Есть много вещей, которые не имеют смысла в этом вопросе. Добавить предлагает увеличить количество элементов в коллекции. Поэтому addBandMembers должен означать, что вы добавляете участников группы в группу. поэтому я ожидаю, что там будет класс Band, содержащий этот метод. Он должен выглядеть примерно так: addBandMembers(Set<BandMember> bandMembers) Ваш addMusicCD определенно является приемлемым способом добавления элемента в коллекцию, но требует некоторого значения для каждого параметра, поэтому вам может потребоваться только компакт-диск, конструктор которого может иметь эти конкретные параметры.

Я бы предложил базовый класс для ваших носителей, который может называться носителем, который может иметь свойство Band и все другие базовые свойства, общие для всех типов носителей. Затем вы можете наследовать от класса мультимедиа в ваших классах CD, DVD и Book и добавлять определенные свойства к этим типам мультимедиа.

Это должно помочь вам начать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...