Как остановить запущенный метод другим методом? - PullRequest
0 голосов
/ 06 марта 2019

Так что это мое университетское задание, с которым я почти все справился.Предполагается использовать метод переопределения, который я должен сделать из моего класса SafeRidingMower (вставит код после объяснения), который выходит из класса моего профессора (который я НЕ МОГУ изменить одну вещь) RidingMower.

RidingMower Class:

    import java.util.*;

/**
 * The riding mower class developed by the engineering department. Contains all the functionality needed
 * for a working riding mower.
 *
 */
public class RidingMower {

    private boolean rider_in_seat = false;

    private boolean is_engine_on = false;

    private boolean is_mower_enabled = false;

    private Random rn = new Random();

    /**
     * Constructor for Riding Mower which automatically launches the main menu.
     */
    public RidingMower()
    {
        mainMenu();
    }

    /** Starts the engine of the riding mower (ignition start) */
    public void start_engine()
    {
        System.out.println("<<< Starting riding mower >>>");

        is_engine_on = true;
    }

    /** Method that randomly seats and unseats a driver */
    private void sit_rider()
    {

        int random = rn.nextInt(5);

        if ( random<=1 )
             rider_in_seat = true;
        else rider_in_seat = false;       

        System.out.print("\t=>Seated? " + rider_in_seat + "\n");
    }

    /** Seat sensor. Returns true if there is a driver seated on the mower or false
     * if no driver is sitting on the mower.
     * @return 
     */
    public boolean check_seat_sensor()
    {   
        return rider_in_seat;
    }

    /** Method that engages the mower blades and begins mowing if the ignition is turned on */
    public void mow()
    {
        start_mowing();
    }

    /** Primary method that handles the mowing. Checks to see if the ignition is on then the 
      mowing starts otherwise the cutting blades are lowered and ready to mow upon engine start
      */
    private void start_mowing()
    {

        is_mower_enabled = true;

        System.out.println("Mower blade ready to mow");

        if ( !is_engine_on ) return;

        int i=1;

        while (true)
        {
            mowing(i++);

        }
    }

    /** Mower fully functioning here and blades are spinning. Simulates a rider being thrown off 
     the mower at step 50,000 */
    private void mowing(int i)
    {
        System.out.println( "Mowing..." + i);

        if ( i>50000 ) rider_in_seat = false;

        if ( rider_in_seat == false )
            System.out.println("\tOMG Mower is moving without a driver?!");

        mowing_hook();
    }

    /** Hook/Stub function called while the mower is mowing. Other departments divisions can override */
    public void mowing_hook()
    {

    }

    /** Turns off the ignition. Stops the mower if running. */
    public void stop_mower()
    {
        System.out.println("Stopping the mower.");
        System.exit(0);
    }

    /** Main menu of the mower simulation. Asks user to check/seat a driver, start the mower, 
     * begn mowing the lawn, or exiting the simulation. Method is private and can not be 
     * overriden.
     */
    private void mainMenu()
    {
        Scanner sc = new Scanner( System.in );
        int option;

        do
        {
            System.out.println();
            System.out.println("1. Is driver seated? (" + rider_in_seat +")" );
            System.out.println("2. Start mower");
            System.out.println("3. Mow the lawn");
            System.out.println("4. Stop mower (if running) and Exit.");
            System.out.println();
            System.out.println("CHOOSE 1-4");

            option = sc.nextInt();

            switch ( option )
            {        
                case 1: sit_rider();
                        break;

                case 2: start_engine();
                        if ( is_mower_enabled ) mow();
                        break;

                case 3: mow();
                        break;

                case 4: stop_mower();
                        break;
            }

        } while ( true ); // Infinite loop here. Select option #4 to exit the program.
    }
}

Класс SafeRidingMower:

public class SafeRidingMower extends RidingMower 
{

    @Override
    public void start_engine() {
        if (check_seat_sensor() == true)
            super.start_engine();
        else
            System.out.println("Seat sensor does not detect a driver."
                    + "Engine will not start.");
    }

    @Override
    public boolean check_seat_sensor() {
        return super.check_seat_sensor();
    }

    @Override
    public void mow() {
        if (check_seat_sensor() == true)
            super.mow();
        else if (check_seat_sensor() == false)
            System.out.println("Seat sensor does not detect a driver."
                    + " Mower will not start.");
        else
            System.out.println("Engine is not on. Cannot start mowing.");
    }

    @Override
    public void mowing_hook() {

    }
}

И драйвер, который, как я полагаю, не относится к конкретной проблеме, с которой я сталкиваюсь, но здесь все равно.

public class TheLawnMowerManDriver {

public static void main(String[] args)
{

    RidingMower mower = new SafeRidingMower();

}

}

Что мне нужно сделать: в классе RidingMower есть метод mowing (), который я не могу переопределить, но я могу переопределить метод mowing_hook (), который вызывается в концескашивания метода ().Я должен остановить работу газонокосилки, когда переменная i = 50000, но я понятия не имею, как это сделать.Я попытался использовать ключевое слово super с переменной, но оно не сработало (я не знаю, должно ли оно работать или нет, я только познакомился с ключевым словом super несколько классов назад).

Кто-нибудь знает, как я могу остановить газонокосилку / остановить переменную, которую я считаю, от переопределения метода mowing_hook ()?

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Я нашел решение этой проблемы.

Как я уже сказал, я считаю, что или вы не поняли проблему, или ваш профессор обманывает вас.

В любом случае, можно остановить выполнение, если мы наблюдаем выполнение метода mowing() indirectly.

Идея состоит в том, чтобы обернуть System.out и записать последнюю напечатанную строку. Итак, в mowing_hook() мы видим, что часы были напечатаны и останавливаются при необходимости.

Рабочий пример вы можете найти здесь: jdoodle.com/a/12KZ

В итоге:

Добавьте этот класс к себе код

class SystemOutWrapper extends PrintStream{
    String lastLine;

    public SystemOutWrapper(OutputStream out){
        super(out);
    }

    @Override
    public void println (String str){
        this.lastLine = str;
        super.println(str);
    }

    public String getLastLine(){
        return lastLine;
    }
}

И переопределить метод таким образом

@Override
public void mowing_hook() {

    if (! (System.out instanceof SystemOutWrapper)){
        System.setOut(new SystemOutWrapper(System.out));
    }

    //I used 100 as the online editor limitation. But you should change to 50000
    if ("Mowing...100".equals( ((SystemOutWrapper) System.out).getLastLine())){
        System.out.println("Limite reached! Should stop now!");
        stop_mower();
    }
}
0 голосов
/ 06 марта 2019

После того, как:
1. i - локальная переменная метода mowing() и;
2. Метод mowing() не передает значение i методу mowing_hook()

Итак, невозможно прочитать значение i в методе mowing_hook().

У меня два гипотезы:
1. Ваш профессор обманывает вас
2. Вы неправильно поняли назначение

Я дам несколько альтернатив:

  1. Изменить сигнатуру метода mowing_hook()

    /** Mower fully functioning here and blades are spinning. Simulates a rider being thrown off the mower at step 50,000 */
    private void mowing(int i)
    {
        System.out.println( "Mowing..." + i);
    
        if ( i>50000 ) rider_in_seat = false;
    
        if ( rider_in_seat == false )
            System.out.println("\tOMG Mower is moving without a driver?!");
    
        mowing_hook(i);
        }
    
        public void mowing_hook(int i)
        {
    
        }
    }
    

    И переопределить таким образом

    @Override
    public void mowing_hook(int i) {
        if (i == 50000) stop_mower();
    }
    
  2. Или используйте переменную экземпляра rider_in_seat

    @Override
    public void mowing_hook(int i) {
        if (!rider_in_seat) stop_mower(); 
    }
    

    Но поймите, что rider_in_seat будет установлен в false только тогда, когда i > 50000 из-за строки if ( i>50000 ) rider_in_seat = false;

...