Выявление взаимосвязи между интерфейсом и наследованием различных классов в Java - PullRequest
0 голосов
/ 24 декабря 2018

Я пытаюсь определить все ошибки в коде ниже.Существует 4 класса:

  • A: интерфейс
  • AImpl: класс, реализующий A
  • B: родительский класс C
  • C: Дочерний класс B

    public interface A { 
       public void doSomeProcess(String s); 
    }  
    
    public class AImpl implements A { 
       public void doSomeProcess(String s) { 
           System.out.println("A Imple Code"); 
           [. . .] 
       } 
    } 
    
    public class B { 
        public A doIt() { 
           [. . .] 
        } 
        public String execute() { 
           [. . .] 
        } 
    } 
    
    public class C extends B { 
       public AImpl doIt() { 
           [. . .] 
       } 
       public Object execute() { 
           [. . .] 
       } 
    } 
    

Вот мое понимание,

  1. A и AImpl хороши, поскольку A является интерфейсным классом, а AImpl должен реализовывать абстрактныеметод в А для выполнения контракта.
  2. Класс C должен быть расширен от класса B public class B extends C
  3. execute() в классе C - это основной метод

Проблема в том, как мне поступить с public A doIt() а public AImpl doIt()?Может ли класс интерфейса быть возвращаемым значением?

Спасибо!

Ответы [ 5 ]

0 голосов
/ 27 декабря 2018

Да, тип интерфейса, вы можете использовать его как тип возвращаемого значения (Он может содержать ссылку на объект любого класса, который прямо или косвенно реализует этот интерфейс)

В вашем случае это ковариантный тип возвращаемого значения, когда вы переопределяете doIt () в классе C. (Так как возвращаемый тип переопределенного метода doIt () в классе C может получить upcast для возврата типа метода doIt () в классе B. это разрешено) AImpl может получить upcast для A, потому что AImpl является потомком A.

0 голосов
/ 24 декабря 2018

Одним из основных аспектов интерфейсов является их повсеместное использование.Просто потому, что вызывающему методу какого-то метода не нужно знать о конкретном классе реализации.

Предположим, что ваш метод возвращает List .В большинстве случаев это прекрасно.Нет необходимости беспокоиться о том, возвращает ли метод ArrayList, LinkedList или любой другой список.

Так что возвращение A вполне нормально, его лучше использовать!

0 голосов
/ 24 декабря 2018

Да, мы можем иметь тип возврата с interface type

Например:

interface Bounceable
{ 
    Bounceable isBouncing();
}

Class Tyre implements Bounceable
{

  @Override
  Bounceable isBouncing()
  {
     Bounceable myVariable;

     //your code 

     return myVariable;
  }

}
0 голосов
/ 24 декабря 2018

Проблема в том, как мне поступить с публичными A doIt () и публичными AImpl doIt ()?Может ли класс интерфейса быть возвращаемым значением?

Без каких-либо проблем ДА , из версии 1.5 допускается переопределение ко-вариантных типов возврата, т. Е. Если дочерний класс переопределяетродительский метод, тогда возвращаемый тип метода не обязательно должен быть того же типа, что и возвращаемый тип родительского метода, он также может быть и дочерним.В вашем случае doIt() дочернего метода может вернуть либо тип A, либо его дочерний AImpl

0 голосов
/ 24 декабря 2018

В Java нет термина «интерфейсный класс».Это должен быть интерфейс или класс.

Да, интерфейс может иметь тип возврата.И польза от полиморфизма видна в таком случае использования.

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