Java: экземпляр класса B в классе A, где класс B использует переменные, объявленные в классе A - PullRequest
0 голосов
/ 28 октября 2019

Класс AutoRedBuilding объявляет переменные экземпляра leftMotor, rightMotor и foundationServo. Класс RobotMover содержит методы, которые используют эти переменные экземпляра, и я хотел бы вызвать методы RobotMover в AutoRedBuilding.

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

Я пытался сделать общедоступными переменные AutoRedBuilding, а затем создать экземпляр RobotMover в AutoRedBuilding, но это не сработало (код ниже). Пример сообщения об ошибке (я получаю одно и то же сообщение об ошибке для всех переменных привода):

RobotMover.java - cannot find symbol
symbol: leftMotor
// Copyright (c) 2019 Terrace BroBots. All rights reserved.

package org.firstinspires.ftc.teamcode;

import com.qualcomm.robotcore.eventloop.opmode.Autonomous;
import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.Servo;

@Autonomous(name="Autonomous: Red Building Zone", group="SkyStone")

public class AutoRedBuilding extends LinearOpMode {

    // declare hardware variables
    public DcMotor leftMotor;
    public DcMotor rightMotor;
    public Servo foundationServo;

    @Override
    public void runOpMode() {
        // initialise hardware variables
        leftMotor = hardwareMap.get(DcMotor.class, "leftMotor");
        rightMotor = hardwareMap.get(DcMotor.class, "rightMotor");
        foundationServo = hardwareMap.get(Servo.class, "foundationServo");

        // wait for game to start
        waitForStart();

        /* 
        THIS IS WHERE RobotMover CLASS METHODS ARE CALLED
        */
        RobotMover mover = new RobotMover();
        mover.driveForward(10, 1);
        mover.driveReverse(10, 1);
        mover.turnRight90();
        mover.turnLeft90();
        mover.clipFoundation();
        mover.unclipFoundation();
    }
}

// Copyright (c) 2019 Terrace BroBots. All rights reserved.

import java.lang.Math; 

public class RobotMover {

    // unit conversion rates
    private double robotWidthCm = 0;
    private double wheelRadiusCm = 0;
    private double degree90ToCm = (2 * Math.PI * robotWidthCm) / 4;
    private double cmToTicks = 2240 / (2 * Math.PI * wheelRadiusCm);

    public void setMotorPowers(double leftPower, double rightPower) {
        leftMotor.setPower(leftPower);
        rightMotor.setPower(rightPower);
    }

    public void driveMotorDistances(double cmLeftDistance, double cmRightDistance, double power) {
        // reset encoders
        leftMotor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);
        rightMotor.setMode(DcMotor.RunMode.STOP_AND_RESET_ENCODER);

        // convert cm to ticks and set target position
        int tickLeftDistance = (int) Math.round(cmLeftDistance * cmToTicks);
        int tickRightDistance = (int) Math.round(cmRightDistance * cmToTicks);
        leftMotor.setTargetPosition(tickLeftDistance);
        rightMotor.setTargetPosition(tickRightDistance);

        // drive until position is reached 
        setMotorPowers(power, power);
        while(leftMotor.isBusy() && rightMotor.isBusy()) {}
        setMotorPowers(0, 0);
    }

    /*
    THESE ARE THE METHODS CALLED IN AutoRedBuilding CLASS
    */

    public void driveForward(double cmDistance, double power) {
        driveMotorDistances(cmDistance, cmDistance, power);
    }

    public void driveReverse(double cmDistance, double power) {
        driveMotorDistances(-cmDistance, -cmDistance, power);
    }

    public void turnRight90() {
        driveMotorDistances(degree90ToCm, 0, 0.8);
    }

    public void turnLeft90() {
        driveMotorDistances(0, degree90ToCm, 0.8);
    }

    public void clipFoundation() {
        foundationServo.setPosition(0.5);
    }

    public void unclipFoundation() {
        foundationServo.setPosition(0);
    }
}

1 Ответ

0 голосов
/ 28 октября 2019

Если вы хотите, чтобы RobotMover знал об этих переменных, их нужно передать этому классу либо в конструкторе, либо в виде setter методов

например,

RobotMover mover = new RobotMover(DCMotor left, DCMotor right); 

. RobotMover должны иметь соответствующие поля

...