Нужно ли снова реализовать все методы интерфейса при наследовании абстрактного класса в Java? - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь расширить абстрактный класс, который реализован одним методом интерфейса, поэтому в моем подклассе я пытаюсь реализовать остальные методы, объявленные в интерфейсе, но подкласс заставляет меня объявлять все методы интерфейса, пожалуйста, помогите мнечтобы исправить это, заранее спасибо, я добавил свой код ниже.Большое спасибо заранее сеньоры.

Мой код

   interface xxx
    {
         int numbers();
         String names();
         Double salary();
    }
    abstract class GetNames implements xxx
    {
        public String names()
        {
            return "Ravi";
        }
    }
    class Check extends GetNames
//This class forcing me to implement names also
    {
        public int numbers()
        {
            return 3;
        }
        public double sal()
        {
            return 25000.00;
        }
    }

    public class AbsUsingInterface {

    }

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Конкретный класс, расширяющий класс abstract, должен предоставлять тело всему абстрактному методу в суперклассе.

Методы в интерфейсе по умолчанию - abstract, если вы не предоставите тело по умолчанию.

Когда абстрактный класс реализует интерфейс, все эти методы интерфейса наследуются как есть, т.е.abstract

Теперь для вашего сценария, где вы предоставили тело для одного из унаследованных методов интерфейса, этот метод больше не является абстрактным в области действия класса Abstract.Таким образом, если класс расширяет этот абстрактный класс, ему не нужно предоставлять тело для вышеуказанного метода, поскольку он больше не является абстрактным (они, конечно, могут его переопределить).

Вы получаете ошибку в Check подкласс, который вы определили для того, чтобы не наследовать метод salary(), а не names() метод, который вы уже определили в GetNames абстрактный класс

0 голосов
/ 20 октября 2018

ваш класс GetNames реализует интерфейс xxx, но вы реализуете только names (), вы должны реализовать метод salary.

interface xxx
{
     int numbers();
     String names();
     Double salary();
}
abstract class GetNames implements xxx
{
    public String names()
    {
        return "Ravi";
    }
    public Double salary()
    {
        return null;//just return null;
    }
}
class Check extends GetNames
{
    public int numbers()
    {
        return 3;
    }
    public double sal()
    {
        return 25000.00;
    }
}

или просто выбросить NotImplementedException;

0 голосов
/ 20 октября 2018

Вам нужно только реализовать методы из интерфейса, которые не были реализованы в абстрактном классе, который является суперклассом для вашего класса, где вы пытаетесь реализовать методы.

Но, похоже, я вижу одну проблему в вашемКласс проверки.

Ваш интерфейс объявляет этот метод,

Double salary();

Где, как и в классе проверки, вы реализуете этот метод,

public double sal()

Так что на самом деле это не такреализовать метод из интерфейса.Вы должны сделать это так же, как в интерфейсе.

Просто создайте метод в своем классе Check следующим образом:

public Double salary()
    {
        return 25000.00;
    }

При реализации / переопределении метода из суперкласса / интерфейса вы должнывсегда используйте аннотацию @Override, поэтому, если какая-либо сигнатура вашего метода будет отличаться, она сразу же запросит у вас ошибку.И да, если вы снова объявите метод names () в своем подклассе Check, он переопределит метод в абстрактном классе. Вы можете сделать что-то подобное в своем классе,

abstract class GetNames implements xxx
{
    @Override
    public String names()
    {
        return "Ravi";
    }
}

class Check extends GetNames
{
    @Override
    public int numbers()
    {
        return 3;
    }
    public double sal()
    {
        return 25000.00;
    }
    @Override
    public Double salary() {
        return sal();
    }

    @Override
    public String names() { // this overrides names() method in GetNames class
        return "Check";
    }


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