Создание нескольких объектов в классе - PullRequest
1 голос
/ 13 февраля 2010

Я пытаюсь создать класс. Давайте назовем это Анкета. В Анкете я хочу создать несколько классов под названием Вопрос. Конструктор Анкеты принимает строковый массив слов, и для каждого слова должен быть класс Вопроса, который принимает его в качестве аргумента для своего конструктора. Другими словами, для каждой строки, передаваемой в качестве аргумента, я хочу создать Вопрос.

Мне нужно иметь возможность поместить Анкету в больший класс и при этом вызывать методы классов Вопроса. Размер массива, передаваемого в Анкету, также варьируется. Я не знаю, как я могу поместить несколько классов в другой класс, когда я не знаю, сколько будет классов, и как ссылаться на них из внешнего класса. Если бы массив был фиксированной длины, я бы просто создал Вопросы как вопрос1, вопрос2, вопрос3 ... но так как это не так, я больше не уверен. Я действительно знаю, что существует максимальное количество классов Вопросов, которые я хочу создать.

edit: для этого я использую J2ME CDLC 1.1 MIDP 2.0 (это часть приложения для мобильного телефона), поэтому мои решения ограничены тем, что оно предлагает.

Ответы [ 5 ]

4 голосов
/ 13 февраля 2010

Вы не хотите иметь отдельную переменную для каждого вопроса - используйте List<Question>, чтобы иметь одну переменную, которая относится к совокупности вопросов:

public class Questionnaire
{
    private final List<Question> questions;

    public Questionnaire(String[] words)
    {
        questions = new ArrayList<Question>();
        for (String word : words)
        {
            questions.add(new Question(word));
        }
    }

    // Use questions here
}

РЕДАКТИРОВАТЬ: Если вы находитесь в среде без генериков, вы можете использовать неуниверсальную форму, например:

    private final List questions;

    public Questionnaire(String[] words)
    {
        questions = new ArrayList();
        for (String word : words)
        {
            questions.add(new Question(word));
        }
    }

или как это, если у вас нет List / ArrayList:

    private final Vector questions;

    public Questionnaire(String[] words)
    {
        questions = new Vector();
        for (String word : words)
        {
            questions.add(new Question(word));
        }
    }

В любом случае вам нужно будет использовать каждый доступ. В качестве альтернативы вы можете использовать массив:

    private final Question[] questions;

    public Questionnaire(String[] words)
    {
        questions = new Question[words.length];
        for (int i = 0; i < words.length; i++)
        {
            questions[i] = new Question(word);
        }
    }
1 голос
/ 13 февраля 2010

Поскольку в J2ME API отсутствует API коллекций , лучше всего взять Vector.

Vector questions = new Vector();
for (int i = 0; i < words.length; i++) {
    questions.addElement(new Question(words[i]));
}
0 голосов
/ 13 февраля 2010

Вы, вероятно, хотите ответить на Set вопросов, а не List. Попробуйте:

private final Set<Question> questions;

Это позволит избежать дублирования вопросов. Все остальное будет таким же, как ответ JonSkeet.

0 голосов
/ 13 февраля 2010
import java.util.*;

public class Questionnaire implements Iterable<Question> {
    private final List<Question> questions;

    public Questionnaire(String ...words) {
       questions = new ArrayList<Question>(words.length);
       for(String word : words) {
           questions.add(new Question(word));
       }
    }

    // allows you to use a Questionnaire object in a for-each loop
    public Iterator<Question> iterator() { return questions.iterator(); }

    @Override
    public String toString() { return questions.toString(); }
}

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

public class QuestionnaireTest {
    public static void main(String[] words) {
        Questionnaire questionnaire = new Questionnaire(words);
        for(Question q : questionnaire) {
            System.out.println("You asked: " + q);
        }
    }
}

Вы также можете использовать его следующим образом:

public class QuestionnaireTest3 {
    public static void main(String[] words) {

        // because I declared the constructor to accept "String ...words", I can specify as many questions as I want using simple syntax
        Questionnaire questionnaire = new Questionnaire("How deep the ocean?", "How high the moon?");
        for(Question q : questionnaire) {
            System.out.println("I asked: " + q);
        }
    }
}

Несмотря на то, что я сделал это в моем первом примере выше, вы должны принять массив объектов String в качестве вопросов. Вот лучший дизайн:

public class Questionnaire implements Iterable<Question> {
    private List<Question> questions = new ArrayList<Question>();

    public void add(Question q) {
        if(q == null) throw new IllegalArgumentException("can't add null question!");

        questions.add(q);
    }

    public Question get(int index) {
       if(index < 0 || index >= questions.size()) throw new IndexOutOfBoundsException("invalid question index: " + index);

       return questions.get(index);
    }

    // allows you to use a Questionnaire object in a for-each loop
    public Iterator<Question> iterator() { 
        return Collections.unmodifiableList(questions).iterator();
    }

    @Override
    public String toString() { return questions.toString(); }
}

public abstract class Question {
    public String getText();
    public String getAnswer();
    public String getOptions();
    // ...
}

public class YesNoQuestion extends Question {
    private final String text;
    private final String answer;

    public YesNoQuestion(String text, boolean answer) {
       if(!(text.startsWith("Is"))) throw new IllegalArgumentException("Must start with is: " + text);

        this.text = text;

        this.answer = answer ? "Yes" : "No"; // if answer == true, the "Yes",...
    }

     @Override
     public String getText() { return text; }

     public String getAnswer() { return answer; }

     public String getOptions() { return "Yes or No ?"; }
}

И теперь вы можете использовать его следующим образом:

public class QuestionnaireTest4 {
    public static void main(String[] words) {

        Questionnaire test = new Questionnaire();

        test.add(new YesNoQuestion("Is dogs animals?", false));
        test.add(new YesNoQuestion("Is me has cheezburgers?", true));

        for(Question q : questionnaire) {

            System.out.println(q);
            System.out.println(q.getOptions());

            String input = null; // you need to code this part
            if(q.getAnswer().equals(input))
                System.out.println("CORRECT!");
            else
                System.out.println("YOU IS STUPID!!!!");
        }
    }
}
0 голосов
/ 13 февраля 2010

Почему бы вам не использовать Список в вопроснике, и для каждого добавляемого вопроса вы, например, добавляете его в Список.

public class Questionnaire
{
    public List<Question> myQuestions {get; private set;}

    public Questionnaire(string[] questions)
    {

       myQuestions = new List<Questions>();

       foreach(string q in questions)
       {
          myQuestions.Add(new Question {questionText = g});
       }
    }
}
public class Question
{
    public string questionText {get; set;}
}

Тогда вы сможете проверить вопросы со стороны ... это то, что вы хотите?

Надеюсь, это поможет

РЕДАКТИРОВАТЬ: о, это Java, но у вас есть идея правильно?

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