2015-11-27 1 views
0

предположим, у меня есть класс А и класс В и интерфейс называется сообщениеМожно ли использовать интерфейс, чтобы говорить с другим классом в java?

public interface Message{ 
    public void sendMessage(); 
} 

public class A implements Message{ 
    @Override 
    public void sendMessage(){ 
     //call the sendMessage() in class B. 
    } 
} 

public class B implements Message{ 
    @Override 
    public void sendMessage(){ 
     System.out.println("Hola Stack!"); 
     } 

} 

без непосредственного обращения к классу В может я каким-то образом вызвать метод SendMessage() в классе B из класса А?

+0

Во-первых, вы бы необходимо определить переменную в ClassA, чтобы вы могли ссылаться на объект ClassB. Вместо того, чтобы иметь переменную, напечатанную как «ClassB», введите ot как «Message», затем инициализируйте ее с помощью экземпляра «ClassB», возможно, через DI, чтобы гарантировать, что A не знает о B –

+1

. Эта проблема может быть решена с помощью [event bus] (http://stackoverflow.com/questions/3987391/why-people-use-message-event-buses-in-their-code). Таким образом, отправителю не нужно знать (или заботиться) о том, кто получает сообщения, но все же может активировать действие в принимающем классе (например, B слушает A, когда он видит сообщение, он вызывает свой собственный 'sendMessage()' метод). – azurefrog

ответ

2

Конечно, вы можете.

class ClassA { 
    private Message message; 

    public ClassA(Message message) { 
     this.message = message: 
    } 

    public void sendMessage() { 
     message.sendMessage(); 
    } 
} 

Просто передать экземпляр B к A:

Message b = new ClassB(); 
Message a = new ClassA(b); 
a.sendMessage(); 
0

Вы вроде злоупотребляет интерфейсов здесь. Конечно, вы можете использовать

Message a = new B(); 
` a.sendMessage(); 

Это будет делать то, что вы хотите, но это не желаемая практика, а не то, что вы хотите. Если вы хотите, А и В, чтобы быть взаимозаменяемыми, вы должны сделать супер класс и есть B наследовать от него, как это, сбросив интерфейс:

public class A { 

    public void sendMessage(){ 
     //call the sendMessage() in class B. 
    } 
} 

public class B extends A{ 
    @Override 
    public void sendMessage(){ 
     System.out.println("Hola Stack!"); 
     } 

} 

Таким образом, вы можете сделать это:

A a = new B(); 
a.sendMessage(); // prints inside of B, but you tell the JVM to forget it is B, and think it is A 

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

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