At this point, all three files have been created and saved to the same folder. You should also have all three files open in Flash, on separate tabs. Let's work on QuizQuestion.as first:

QuizQuestion will need to have many properties. Instances of QuizQuestion will have a TextField to display the question, RadioButtons that lay out the possible answers, an integer variable to store the correct answer to the question, another integer variable to store the user's answer to the question, plus several others. Once again, here's the file as we last saved it:
package {
    import flash.display.Sprite;
   
    public class QuizQuestion extends Sprite {
       
        public function QuizQuestion() {
           
        }
    }
}

This file extends the Sprite class, so the Sprite class has to be imported. In case you haven't tried my earlier tutorials, I pointed out in those that whenever you add to your class files, you'll start to realize when you've added something that requires another import statement. Let's add a "question" property, a String that will store the text of the question. Next, a TextField property that will be used to display the question. Also, since we don't know the length of the question in advance, we won't know how wide to make the TextField to accomodate the length of the question. This is solved for us by setting the TextField's autoSize property. There just happens to be a TextFieldAutoSize class that contains the auto sizing constants we need, so we'll import that too:
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;

    public class QuizQuestion extends Sprite {
        private var question:String;
        private var questionField:TextField;

        public function QuizQuestion() {

        }
    }
}

Next, we need to make provision for somehow getting the required infomation into our class. We're going to need to display a question, display the list of possible answers, and also somehow store what we know to be the correct answer. All of this information will come into this class in the constructor's parameter list.

I'm now going to tell you about a new feature in AS3. It's called the ...rest parameter, and you may have heard of it and wondered how it works. Basically, it's a parameter that can store any number of arguments in itself. For this reason, if you use ...rest, you need to make sure it's the last parameter in the list, because it's a catch-all for all the arguments that are too numerous for the parameter list. It saves all the extra arguments as an array, and the array's name is whatever name you supply in place of the word "rest."

In our case, we're making a multiple choice quiz, and using the ...rest parameter as the last parameter will allow us flexibility in the number of possible choices that can be supplied with each question. In other words, we can make multiple choice questions that can have three possible answers, four possible answers, five--or however many we want, actually. Within reason, of course, because we want them to all fit on the screen without the need for scrolling. We'll use the name "answers" in place of the word "rest."

I've also gone ahead and created some private variables to store the values that are passed in to the parameter list, so that they can be stored for future reference. Without doing this, the contructor would run, and anything you might want to do with this parameter list had better be done in the contructor, because their values are lost after the constructor function ends.
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;

    public class QuizQuestion extends Sprite {
        private var question:String;
        private var questionField:TextField;
        private var theCorrectAnswer:int;
        private var choices:Array;

        public function QuizQuestion(theQuestion:String, theAnswer:int, ...answers) {
            //store the supplied arguments in the private variables:
            question = theQuestion;
            theCorrectAnswer = theAnswer;
            choices = answers;
        }
    }
}

Anyway, what will be supplied to the parameter list is first the question, then the correct answer, and finally, any number of possible multiple choice answers. All the arguments from the third one on will be caught and stored in the ...answers parameter, which is really an array. Inside the constructor, the value of each parameter is assigned to a class member (variable), including the ...answers one.

There are a few more things remaining to accomplish in the constructor. The next thing is to create the TextField and position it. I've called the TextField that holds the question "questionField."

"questionField" is instantiated as a new TextField, then given some positioning values. At this point, consider that it would be nice to have some positioning variables at the top of the code, in the variable list. There would variables for the x and the y of the question, variables for the x and y of the first answer, and one other variable representing how far apart to vertically space the answers. These variables are named questionX, questionY, answerX, answerY, and spacing, all of them integers. If it ever becomes necessary to change the layout, this will give one handy place to do it. Of course, there's nothing wrong with temporarily physically laying out some things on flash's stage (in the fla file) to help you come up with these numbers. With all these additions, here's the code so far:
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;

    public class QuizQuestion extends Sprite {
        private var question:String;
        private var questionField:TextField;
        private var theCorrectAnswer:int;
        private var choices:Array;
       
        //variables for positioning:
        private var questionX:int = 25;
        private var questionY:int = 25;
        private var answerX:int = 60;
        private var answerY:int = 55;
        private var spacing:int = 25;

        public function QuizQuestion(theQuestion:String, theAnswer:int, ...answers) {
            //store the supplied arguments in the private variables:
            question = theQuestion;
            theCorrectAnswer = theAnswer;
            choices = answers;
            //create and position the textfield (question):
            questionField = new TextField();
            questionField.text = question;
            questionField.autoSize = TextFieldAutoSize.LEFT;
            questionField.x = questionX;
            questionField.y = questionY;
            addChild(questionField);
        }
    }
}

The next thing to accomplish, still in the constructor, is to create and position the radio buttons. Also, there needs to be a RadioButtonGroup, so that each radio button can be assigned to the same group. This requires importing both the RadioButton class and the RadioButtonGroup class. We'll be adding an event listener to the RadioButtonGroup instance. This is the Event.CHANGE event. This requires importing the Event class. Note the three additions to the import block, and the additional code in the constructor:
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.Event;
    import fl.controls.RadioButton;
    import fl.controls.RadioButtonGroup;

    public class QuizQuestion extends Sprite {
        private var question:String;
        private var questionField:TextField;
        private var theCorrectAnswer:int;
        private var choices:Array;
       
        //variables for positioning:
        private var questionX:int = 25;
        private var questionY:int = 25;
        private var answerX:int = 60;
        private var answerY:int = 55;
        private var spacing:int = 25;

        public function QuizQuestion(theQuestion:String, theAnswer:int, ...answers) {
            //store the supplied arguments in the private variables:
            question = theQuestion;
            theCorrectAnswer = theAnswer;
            choices = answers;
            //create and position the textfield (question):
            questionField = new TextField();
            questionField.text = question;
            questionField.autoSize = TextFieldAutoSize.LEFT;
            questionField.x = questionX;
            questionField.y = questionY;
            addChild(questionField);
            //create and position the radio buttons (answers):
            var myGroup:RadioButtonGroup = new RadioButtonGroup("group1");
            myGroup.addEventListener(Event.CHANGE, changeHandler);
            for(var i:int = 0; i < choices.length; i++) {
                var rb:RadioButton = new RadioButton();
                rb.textField.autoSize = TextFieldAutoSize.LEFT;
                rb.label = choices[i];
                rb.group = myGroup;
                rb.value = i + 1;
                rb.x = answerX;
                rb.y = answerY + (i * spacing);
                addChild(rb);
            }
        }
    }
}

The help files are really indispensible when you come to this point. You have to look up the RadioButton and RadioButtonGroup classes, and read up on whatever properties and methods of these classes you think you might need to use to accomplish your goal.

First, we create a RadioButtonGroup instance, and its constructor requires that we pass it a string of text to use for its name property. We won't be using this name, but we must supply one nonetheless. In the help files, the example there uses the name "group1," so I just kept that. The important name is the variable name,  "myGroup," and that's the one we add the Event listener to, in order to listen for the CHANGE event. Remember, what we're constructing is a question and set of possible answers. Although there will be many of these instances made, when we write the class, it can be helpful to think of it in terms of just one instance, at least temporarily. That's why we need only construct one radio button group.

Next, we set up a for loop, and loop through the "choices" array. For each choice, we create a new radio button. The "rb" variable gets reused each time through the loop. This is just a temporary name, in other words, and each time through the loop it refers to a new radio button. Each radio button has its textField property autoSized to the left. This is similar to what we did with the questionField textfield; it allows for expansion to the right. Since "choices" is an array of strings, we can use choices[i] to set the label property of the radio button to the appropriate string of text. Each radio button is assigned to the same radio button group ("myGroup"). Each radio button has its "value" property set to the loop counter plus one. So in a four answer multiple choice question, each possible answer will have a value from 1 through 4, respectively. This value will be important later on. When the user clicks on a radio button, the event listener for the radio button group will be triggered, and this value property is what will be returned in the radio button group's "selectedData" property. Again, you don't find this stuff out without going through the help files quite a bit, and experimenting.

Each radio button is then positioned using the positioning variables created earlier (with a little help from the loop counter as a multiplier), and then added to the display list for this Sprite using addChild(). None of this stuff will show up on flash's stage, yet, though, until some external code does an addChild() of its own on the whole thing. Later on, QuizApp will do exactly that.

Next, we'll want to write the function "changeHandler," which will run whenever the user clicks on one of the radio buttons. When this happens, Flash broadcasts an Event.CHANGE event, and our changeHandler function is called. Inside this function is where we want to set a private variable to the value of the button that was clicked on. We haven't created such a variable yet, so at the top of the code, add the variable "theUserAnswer" to the variables list and give it an integer data type. Inside the changeHandler function, "event.target" will refer to the radio button group as a whole, and the radio button group's "selectedData" property will hold the "value" of the button that was clicked on.

The final thing to put in the code is a couple of getter functions. One of these will be used by external code to retrieve the correct answer to the question. The other will retrieve the answer that the user supplied. This will be important later on for calculating the score. Here's the final code for QuizQuestion, with these two getter functions added at the end:
package {
    import flash.display.Sprite;
    import flash.text.TextField;
    import flash.text.TextFieldAutoSize;
    import flash.events.Event;
    import fl.controls.RadioButton;
    import fl.controls.RadioButtonGroup;
   
    public class QuizQuestion extends Sprite {
        private var question:String;
        private var questionField:TextField;
        private var choices:Array;
        private var theCorrectAnswer:int;
        private var theUserAnswer:int;
       
        //variables for positioning:
        private var questionX:int = 25;
        private var questionY:int = 25;
        private var answerX:int = 60;
        private var answerY:int = 55;
        private var spacing:int = 25;
               
        public function QuizQuestion(theQuestion:String, theAnswer:int, ...answers) {
            //store the supplied arguments in the private variables:
            question = theQuestion;
            theCorrectAnswer = theAnswer;
            choices = answers;
            //create and position the textfield (question):
            questionField = new TextField();
            questionField.text = question;
            questionField.autoSize = TextFieldAutoSize.LEFT;
            questionField.x = questionX;
            questionField.y = questionY;
            addChild(questionField);
            //create and position the radio buttons (answers):
            var myGroup:RadioButtonGroup = new RadioButtonGroup("group1");
            myGroup.addEventListener(Event.CHANGE, changeHandler);
            for(var i:int = 0; i < choices.length; i++) {
                var rb:RadioButton = new RadioButton();
                rb.textField.autoSize = TextFieldAutoSize.LEFT;
                rb.label = choices[i];
                rb.group = myGroup;
                rb.value = i + 1;
                rb.x = answerX;
                rb.y = answerY + (i * spacing);
                addChild(rb);
            }
        }
       
        private function changeHandler(event:Event) {
            theUserAnswer = event.target.selectedData;
        }
        public function get correctAnswer():int {
            return theCorrectAnswer;
        }
        public function get userAnswer():int {
            return theUserAnswer;
        }
    }
}