У меня проблемы с методом в наследственных классах - PullRequest
0 голосов
/ 24 октября 2019

У меня есть 2 класса, один из которых расширяет суперкласс. когда я вызываю подкласс из основного, я получаю сообщение об ошибке, потому что «метод, который я вызываю, не является частью класса», но поскольку моя программа продолжается, он должен работать, я должен был использовать его только с приведениемкласса, но мой учитель сказал мне, что кастинг не должен использоваться в такой работе, поэтому, пожалуйста, я хотел бы понять, где я ошибаюсь, и где я могу лучше

(я предоставляю код3 класса, подкласс, суперкласс и основной)

Основной

import java.util.Scanner;
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        System.out.print("Type in the number");
        int number = in.nextInt();

        System.out.print("Type in the name");
        String name = in.next();

        Test testObj = new Test(number);


        testObj = new TestSub(number);

        testObj.setNameSub(name);

        in.close();
    }
}

Суперкласс

public class Test {

    protected int number;
    protected String name;

    public Test(int number){
        this.number=number;
    }

    public void setName(String name){
        this.name=name;
    }

    public String toString(){
        return "the name is "+name+"the number is "+number;
    }
}

Подкласс

public class TestSub extends Test {

    public TestSub(int number){
        super(number);
    }

    public void setNameSub(String name){
        setName(name);
    }

    public String toStringSub(){
        return toString();
    }
}

Я получаю следующую ошибку:

Метод setNameSub (String) не определен для типа Test

В главном, где есть эта инструкция: testObj.setNameSub(name);

1 Ответ

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

Ошибка здесь (как указано в комментариях), что вы инициализируете testObj как Test вместо TestSub, вызывая ошибку, когда компилятор не может найти setNameSub () между методами Test.

Итакпростое решение состоит в том, чтобы явно инициализировать testObj как TestSub.

Правильное решение, использующее преимущества наследования методов, состояло бы в том, чтобы сохранить инициализацию как есть, но вместо этого вызвать метод testObj.setName (name),и удаление методов setNameSub () и toString () из класса TestSub, поскольку они не добавляют никаких отличий от методов в классе Test.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...