2010-02-12 5 views
1

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

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

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

ответ

4

Вы не хотите иметь отдельную переменную на каждый вопрос - используйте 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 
} 

EDIT: Если вы находитесь в среде без дженериков , вы могли бы использовать, не общую форму, как это:

private final List questions; 

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

или как это, если у вас нет списка/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

'questions = new ArrayList ();' возможно? «Список» - это интерфейс в конце концов. Учитывая тег 'newbie', возможно, стоит указать необходимость в import java.util. *;' (Или более конкретных импортов), а также – barrowc

+0

Джон, это использование дженериков, не так ли? Возможно, я должен упомянуть, что я работаю с J2ME. Я не думаю, что он поддерживает дженерики. – colig

+0

как colig points oout, вы не можете создать экземпляр списка – les2

-1

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

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

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

Надеется, что это помогает

EDIT: ооо является Java, но вы получили идею правильно?

+0

Как и в случае с другим ответом выше, 'List' является интерфейсом, поэтому' new List (); 'неверен. 'List' должен быть' ArrayList' (или другим классом, который реализует интерфейс 'List' и' 'должен быть' ' – barrowc

+0

Также' get; private set; 'и' get; set; 'детали не выглядят чтобы быть Java. C# может быть? – barrowc

+0

бедный парень едва знает java, и вот вы его ругаете с C#? – les2

0
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

Вы говорите {get; set;} на моем посту, и вы показываете ему ITERATOR ??? COME ON !!! – MRFerocius

+0

LMAO !!!!! Эй, этот трюк Iterator может сделать вашу жизнь более приятной. Приятно уметь думать о чем-то, что представляет собой коллекцию вещей в виде коллекции. Таким образом, вам не нужно на самом деле выставлять свой список клиентам. Просто дайте им метод add, get и Iteratate. Возможно, numberOfQuestions() тоже. предполагая, что человек собирается на самом деле хотите создать программу со своим классом. Я думаю, что я жаловался на не-java-код в качестве ответа на вопрос Java !!!! – les2

1

В J2ME API не хватает Collections API, лучше всего, чтобы захватить Vector.

Vector questions = new Vector(); 
for (int i = 0; i < words.length; i++) { 
    questions.addElement(new Question(words[i])); 
} 
0

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

private final Set<Question> questions; 

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

+2

J2ME тоже не имеет. – BalusC

+0

Ooops, неважно, не тэг j2me. – fastcodejava