2015-10-31 3 views
3

У меня есть класс, который реализует интерфейс, но имеет несколько дополнительных методов. Я не могу редактировать интерфейс для добавления дополнительных методов, и один из методов этого интерфейса возвращает тип самого интерфейса.Как я могу вызвать метод, который находится в классе, который реализует интерфейс, на объект этого типа интерфейса?

public interface ExampleInterface{ 
    public ExampleInterface method1(); 
} 

У класса есть дополнительный метод, который я хочу использовать, который распечатает содержимое класса.

public class ExampleInterfaceImpl implements ExampleInterface { 
    public ExampleInterface method1() { 
     //method code 
    } 
    public void print() { 
     //print method code 
    } 
} 

Так что мой вопрос, если у меня есть объект типа ExampleInterface, то есть то, что возвращаемый method1(), и я тогда хочу напечатать его с помощью печати(), как можно что делаю, посмотрев, что печать() есть в ExampleInterfaceImpl поэтому не может быть вызван на объект типа ExampleInterface.

+0

пожалуйста, напишите ваш вопрос более точным – Kitesurfer

+0

Вы можете попытаться бросить или использовать 'instanceof' , иначе вы не можете, это только то, что делают интерфейсы. –

+0

Если вы знаете, что это на самом деле 'ExampleInterfaceImpl', вы можете применить его к этому типу и использовать этот метод. Но это пахнет плохим дизайном. Вероятно, вы должны использовать 'toString()' правильно вместо 'print()', и тогда вы сможете использовать это для печати объекта без кастинга. – RealSkeptic

ответ

1

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

if (myObject instanceof ExampleInterfaceImpl) { 
    ((ExampleInterfaceImpl) myObject).print(); 
} 
+0

Обратите внимание, что это очень плохой ООП. Если вам действительно нужен этот метод, он, вероятно, также должен быть в интерфейсе. – Clashsoft

+0

@ Clashsoft согласился, но OP заявил, что не может изменить интерфейс. – Mureinik

1

Проверьте, есть ли ExampleInterface объект instanceof ExampleInterfaceImpl. Затем вы можете применить его к этому методу и вызвать метод - ((ExampleInterfaceImpl)object).print();.

1
public void maybePrint(ExampleInterface obj) { 
    if (obj instanceof ExampleInterfaceImpl) { 
     ((ExampleInterfaceImpl)obj).print(); 
    } 
} 

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

Возможно также использовать отражение, чтобы проверить, имеет ли класс объекта метод print(), но это не очень элегантно и не рекомендуется.

1

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

interface MyExampleInterface extends ExampleInterface { 
    MyExampleInterface method1(); 
    void print(); 
} 

class MyExampleInterfaceImpl implements MyExampleInterface { 

// later 
MyExampleInterface mei = new MyExampleInterfaceImpl(); 
mei.method1().print(); 
1

Во-первых, от комментариев @RealSkeptic, внедрение toString метода вашей проблемы является правильным. Если не

Лучше дизайн должен был бы создать другой интерфейс, который может быть Printable как

public interface Printable { 
    void print(); 
} 

и реализовать все классы, которые могут быть для печати, в вашем случае это ExampleInterfaceImpl и проверить объекты типа, как показано ниже

if(object instanceof Printable) { 
    Printable object = (Printable) object; //this can be ExampleIntefaceImpl object 
    object.print(); //is valid 
} 
1

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

 ExampleInterface exampleInterface = new ExampleInterfaceImpl(); 

    ((ExampleInterfaceImpl)exampleInterface).print(); 
1

Так что мой вопрос, если у меня есть объект типа ExampleInterface, т.е. , что возвращается method1(),

вы можете создать объект класса MyExampleInterfaceImpl по ссылающегося типа интерфейса ExampleInterface

ExampleInterface mei = new MyExampleInterfaceImpl(); 

при вызове method1() т.е. mei.method(); то просто вызовите метод из ваш конкретный класс, который реализовал интерфейс ExampleInterface

как это может быть, посмотрев, что печать() находится в

Простой делать явное приведение переменной см из ExampleInterface в MyExampleInterfaceImpl() затем вызывать метод print()

((ExampleInterfaceImpl)mei).print(); 

more on explicit casting

+0

OP специально заявляет, что у них есть экземпляр 'ExampleInterface'. –

+0

@DaveNewton проверить, правильно ли это сейчас? – Roushan45

+0

Конечно, хотя это, кажется, обман всех остальных ответов. –

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

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