2016-03-11 6 views
1

У меня есть интерфейс, который имеет 4 метода и класс, который реализует интерфейс. Здесь возникает вопрос: «Как я могу наследовать от интерфейса только 2 из этих методов, а мой класс не стал абстрактным?»Наследовать скрытые методы

interface Class1 { 
    void method1(); 
    void method2(); 
    void method3(); 
    void method4(); 
} 


public class Class2 implements Class1 { 

    @Override 
    public void method1() { 

    } 

    @Override 
    public void method2() { 

    } 
} 
+1

Разделить интерфейс. – saka1029

+0

Мне не разрешено разделить мой интерфейс. –

+0

Почему бы и нет? Это академическое задание? Если да, то какой полный текст проблемы –

ответ

1

Вы должны получить хитрость, и вам нужно искать, почему это работает, особенно если это вопрос с интервью. Это в основном для совместимости (методы по умолчанию в интерфейсе), и требует Java 8.

public interface One { 
    void method1(); 
    void method2(); 
    void method3(); 
    void method4(); 
} 

public interface Two extends One{ 
    default void method1(){} 
    default void method2(){} 
} 

public class Three implements Two{ 

    @Override 
    public void method3() {} 

    @Override 
    public void method4() {} 

} 

неабстрактных Three.class реализует method3 и method4 из One.class без определения метода тел для method1 и method2. Method1 и Method2 определены с реализацией по умолчанию в интерфейсе Two.class.

+1

Я думаю, что это единственный ответ, который действительно решает ответ; хотя, конечно: это похоже на теоретическую; практически без практической ценности. И, конечно же, предполагается, что у него есть Java 8 (что не упоминалось в вопросе). – GhostCat

+0

Согласитесь, что это мало практического значения. Это был вопрос интервью, как он упомянул в комментариях, поэтому, возможно, у них есть устаревший код или, как правило, ищет того, кто занимается производственным кодом, который несколько раз обновлял версию Java в своей истории или что-то в этом роде. Я отредактирую свой ответ, чтобы указать Java 8, хороший звонок! –

1

У вас нет.

Где-то в вашей цепочке наследования эти методы должны быть реализованы. Это и есть цель интерфейсов.

Если вы используете Java 8, в интерфейсах есть новые реализации по умолчанию, посмотрите подробности at this page и, возможно, это поможет вашему делу, если вам нужно, чтобы ваш конкретный класс наследовал от абстрактного, который обеспечивает реализацию для эти 2 нежелательных метода (даже если его напечатать веселое сообщение «// TODO») или удалить их из интерфейса.

0

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

interface ClassA { 
     void method1(); 
     void method2(); 
    } 

    interface ClassB { 
     void method3(); 
     void method4(); 
    } 
0

interface Используется, когда вы хотите, чтобы набор программ выполнял определенный тренд или приобретал общий набор свойств. Эти свойства объявляются как методы в interface. Интерфейс может иметь только абстрактные методы, и он наследует эти методы и определяет их там, где находится линия наследования.

Абстрактный метод будет выглядеть следующим образом:

public void hello();

Он не имеет тела метода. Вам нужно наследовать его и определить тело метода.

Рассмотрим interface animal.

public interface animals 
{ 
public void walks(); 
public void eats(); 
public void sleeps(); 
public void dog_breed(); 
public void barks(); 

} 

Рассмотрим 2 класса с именем Jimmy_the_dog и Tom_the_cat.

Мы хотели бы, чтобы эти 2 класса реализовали interface animal, чтобы придать им свойства животных. Но проблема заключается в абстрактных методах barks() и dog_breed() в помехах. Собака может иметь все свойства, упомянутые в животном интерфейса, но для кошки не имеет смысла наследовать методы barks() и dog_breed().

Здесь мы разделим interface. Здесь мы разделим интерфейс животного на интерфейс собаки и интерфейс животного. Следовательно, свойства в животном-интерфейсе станут более распространенными для животных в целом.

public interface animals 
    { 
    public void walks(); 
    public void eats(); 
    public void sleeps(); 
    } 


public interface dog 
    { 
    public void barks(); 
    public void dog_breed(); 

    } 

Как работать с вышеуказанными двумя интерфейсами?

  • public class Tom_the_cat implements animal

    • public class Jimmy_the_dog implements animal implements dog

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

выше интерфейс может работать следующим образом тоже:

  • public interface dog extends animal
  • public class Jimmy_the_dog implements dog

Jimmy_the_dog получает все свойства животных и собак.

Примечание:

Класс может расширить один класс только, но он может реализовать несколько интерфейсов.

0

Вы не можете этого сделать. Это сводится к тому, что подразумевает ключевое слово реализует класс.

Подлинный класс не может реализовать интерфейс без использования всех методов интерфейса. Если вы не реализуете все необходимые методы, вам нужно объявить абстрактный класс или удалить декларацию.

Смежные вопросы