使用Abstract Superclass生成子类的随机实例

时间:2011-12-14 03:02:56

标签: java graphics random abstract-class

所以我一直在讨论这个项目任务,我不知道如何完成它。我已经完成了80%,但最后一部分我甚至不知道一般的想法。问题是

“然后编写一个方法randomVehicle随机生成Vehicle引用,构建汽车和卡车的概率相等,随机位置。调用它10次并绘制所有这些引用。”

我有一个主方法,一个抽象超类Vehicle和两个Car和Truck的子类。我知道如何使用循环进行概率但我不知道如何采用该概率答案(1将是卡车,2将是汽车)并使用它来参考汽车和卡车的预定义形状。

换句话说,我如何创建程序,在我编译并运行后,将这些随机决定的汽车和卡车显示出来。

很抱歉,如果问题令人困惑,但我只是在学习抽象课程。

到目前为止,这是代码:

主要方法

import java.awt.*;
@SuppressWarnings("serial")
class drawTest extends Canvas{
public drawTest(){
    setSize(800, 600);
    setBackground(Color.white);
}
public static void main(String[] argS){
    drawTest canvas = new drawTest();  
    Frame aFrame = new Frame();
    aFrame.setSize(800, 600);
    aFrame.add(canvas);   
    aFrame.setVisible(true);
}
public void paint(Graphics canvas){
    Vehicle car = new CarTest();
    car.paint(canvas);
    paint(canvas);

}
}

CarTest班级

import java.awt.*;
@SuppressWarnings("serial")
public class CarTest extends Vehicle{

public void paint(Graphics canvas){
    canvas.drawOval(10+super.x, 30+super.y, 15, 15);    // Front Wheel
    canvas.drawOval(45+super.x, 30+super.y, 15, 15);    // Back Wheel
    canvas.drawRect(5+super.x, 10+super.y, 60, 20);     // Bottom of Car
    canvas.drawRect(15+super.x, 5+super.y, 40, 5);      // Bottom of Car
}
}

TructTest班级

import java.awt.*;
@SuppressWarnings("serial")
public class TruckTest extends Vehicle{

public void paint(Graphics canvas){
    canvas.drawRect(30+super.x, 5+super.y, 100, 30);    // Cargo Section
    canvas.drawOval(30+super.x, 35+super.y, 15, 15);    // Wheel Under Cargo
    canvas.drawOval(45+super.x, 35+super.y, 15, 15);    // Wheel Under Cargo
    canvas.drawOval(100+super.x, 35+super.y, 15, 15);   // Wheel Under Cargo
    canvas.drawOval(115+super.x, 35+super.y, 15, 15);   // Wheel Under Cargo
    canvas.drawRect(5+super.x, 15+super.y, 20, 20);     // Driver Section
    canvas.drawOval(5+super.x, 35+super.y, 15, 15);     // Wheel Under Driver
}
}

摘要Vehicle

import javax.swing.*;
import java.awt.*;
@SuppressWarnings("serial")
public abstract class Vehicle extends JApplet{

public Vehicle(){
        // Generates Random position
    x = (int)(Math.random()*700);
    y = (int)(Math.random()*550);
}
public abstract void paint(Graphics canvas);

public void randomVehicle(){
    int carTruckChoice = (int)(1+Math.random()*2);
        if (carTruckChoice == 1){
            // don't know if this is the right implementation 
        }
        else if (carTruckChoice == 2){
            // don't know if this is the right implementation 

        }
}
public int x;
public int y;
}

4 个答案:

答案 0 :(得分:2)

伪代码让你入门:

randomVehicle = 
    randomPosition = randomPosition()
    randomNumber = randomOneOrTwo()

    if (randomNumber is 1)
        vehicle = new Car()
    else
        vehicle = new Truck()

    vehicle.setPosition(randomPosition)
    return vehicle

for 1..10
   randomVehicle().draw()

你有一个抽象类Vehicle,以及两个具体的子类Car and Truck。

答案 1 :(得分:2)

一般来说,StackOverflow不接受家庭作业问题,但我会做一个例外,因为这基本上是一个成语,因为我真诚地认为你已经尝试过这个。

这是一种生成一个随机载体的方法:

public static Vehicle randomVehicle(){
   return (Math.random() < .5) ? new CarTest() : new TruckTest();
}

<强>解释

Math.random()生成0到1之间的数字。

括号中的表达式测试是否小于一半;即它在truefalse之间随机选择。

问号是Java ternary operator。如果括号中的表达式返回true,则vehicle将初始化为第一个操作数,即Car()的新实例,反之亦然。

答案 2 :(得分:2)

public void randomVehicle() {
  Random random = new Random();
  Vehicle vehicle;
  for(int i = 0; i<10; i++) {
     int randomChoice = random.nextInt(2);
     if(randomChoice == 1){
        vehicle = new Car();
     } else {
       vehicle = new Truck();
     }
//draw vehicle here .. vehicle.draw();
   }
}

答案 3 :(得分:0)

如果要生成A子类的随机实例,则需要2件事。

1)包含所有“n”个实例类的数据结构

2)在从0到n-1的任何数字上着陆的相等概率的随机分布。

可以使用包含类的java(列表,数组或枚举)中的任何线性数据结构来实现数据结构。然后,通过迭代100个随机数生成,您可以使用反射通过直接从数组(或枚举或列表等)基于索引访问类来生成类的实例。

此解决方案的优点在于,当您添加新的汽车类型时,您只需要将类名添加到数组结构中......对底层实现没有其他更改。