2013-03-07 3 views
2

Рассмотрим интерфейсыOverride/Отключить метод супер-интерфейс

public interface SuperInterface { 

    public void execute(Map<String,object> argument); 

} 

public interface SubInterface extends SuperInterface { 

    public void execute(Argument extra , Map<String,Object> args); 

} 

Можно ли полностью перекроет SuperInterfaces.execute с SubInterface.execute даже если он имеет различные аргументы?

OR

Я делаю это неправильно? Каков правильный способ разработки этой спецификации?

ответ

3

Возможно ли полностью переопределить SuperInterfaces.execute с помощью SubInterface.execute, хотя у него разные аргументы?

Если вам разрешено это сделать, вы нарушите соглашение.

Я делаю это неправильно?

Да, конечно.

Каков оптимальный дизайн этой спецификации?

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

5

Нет. При переопределении метода он должен иметь одинаковые числа и типы аргументов. В настоящее время вы находитесь перегрузкаexecute метод в SubInterface.

Вы можете, однако, позвонить execute(Map<String, Object> args) от execute(Argument extra , Map<String, Object> args) от вашей реализации SubInterface.

0

Ваш SubInterface должен быть класс abstract.

Тогда вы можете использовать по умолчанию и final исполнение one-arg execute, которое фактически вызывает two-arg execute.

0

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

Будучи интерфейсом, он не позволит переопределять. bcz overriding - это термин, относящийся к defination, но интерфейсные методы его не имеют.

0

Лучшее, что вы можете сделать, это @Deprecate (d) метод.

например.

public interface SuperInterface { 

     public void execute(Map<String,object> argument); 

    } 

    public interface SubInterface extends SuperInterface { 

     @Deprecated 
     public void execute(Map<String,object> argument); 
     public void execute(Argument extra , Map<String,Object> args); 

    } 

Таким образом, вы (и другие) будете уведомлены о недействительном использовании метода класса. Если вы ожидаете Java8, я думаю, что вы сможете создать также метод по умолчанию для метода в дополнительном интерфейсе и выбросить исключение, когда кто-то его выполнит (конечно, класс реализации не должен реализовывать метод :)

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