2011-12-16 2 views
3

Я попытался это сделать, но я не могу найти приемлемый ответ. Является ли несогласованность интерфейса, когда вы создаете класс, реализуете два или более интерфейса, которые несовместимы друг с другом? Например:Java: Что такое несоответствие интерфейса?

public interface Lion() 
{ 
    public void eat(); 
} 

public interface Tiger() 
{ 
    public void eat(); 
} 

public class Liger implements Lion, Tiger 
{ 
    public void eat(); //Problem: How does it eat? Like a lion or tiger? 
} 

Я правильно или от основания?

+0

К сожалению, нет прямого способа решить эту проблему. Связанные темы: http://stackoverflow.com/questions/6211070/class-inheriting-from-several-interfaces-having-same-method-signature и http://stackoverflow.com/questions/2598009/method-name-collision -in-interface-implementation-java – adatapost

+1

эта проблема в C# решена путем явной реализации интерфейсов. –

ответ

3

В Java, вы гарантированно, что два метода интерфейса, который компилировать к одной и той же функции возвращают один и тот же «тип» .... Таким образом, в этом контексте, интерфейс несогласованность может означать:

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

  2. Существует также специфический (не-java-специфический) GUI-коннотации, в котором пользовательский интерфейс запутан, при этом аналогичные компоненты используются для разных задач (или наоборот, одна и та же задача запускается различными компонентами GUI).

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

0

Я думаю, что следующая вещь имеет больше смысла,

public interface Animal{ 
    public void eat(); 
} 

public class Lion implements Animal{ 
    //code 
} 

public class Tiger implements Animal{ 
    //code 
} 

public class Liger extends Lion /*or Tiger*/{ 
    public void eat(){} 
} 

или нет?

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