Вопрос о наследовании

Рейтинг: 0Ответов: 1Опубликовано: 08.11.2014

Добрый вечер, уважаемые форумчане.
Возник вопрос по наследованию.

Имеется интерфейс и две имплементации этого интерфейса. Допустим, классы A и B. При инициализации класса A и класса B необходимо присвоить классу A класс B. Вопрос, собственно, в том, как это сделать? При попытке такое провернуть вполне ожидаемо, что java выкидывает Exeption java.lang.ClassCastException с описанием cannot be cast to.

Вот пример кода:

public interface Session {
public String getName();
public void setName(String name);
}

public class Websocket implements Session {
private String name;

public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
}

public class CWebsocket implements Session {
private Integer id;

public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
}

public class Test {
public static void main(String [] args) {
    Websocket websocket =  new Websocket();
    websocket.setName("test");

    CWebsocket cWebsocket = (CWebsocket) websocket;
    System.out.println(cWebsocket.getName());
}
}

Заранее большое спасибо за внимание к проблеме.

Ответы

▲ 4

Минутка словоблудия и отвлеченных рассуждений.

Понятие интерфейса в ООП не предполагает, что два класса, его реализующих, должны быть взаимозаменяемы. Смысл интерфейса в том, что классы, его реализующие, могут выполнять одинаковые действия. То есть это не означает, что один такой класс может быть заменен другим. Это означает, что поведение одного класса может быть заменено поведением другого. Вроде бы разница невелика, но она на само деле она существенна. Скажем, Человек может ходить (реализует соответствующий интерфейс), но и Часы тоже могуть ходить (тоже реализуют интерфейс). То есть и Человек и Часы могут выполнять одинаковое действие (хоть и совершенно разными способами), однако нельзя сказать, что объект класса Человек может быть заменен экземпляром класса Часы - между ними нет ничего общего, роме того, что они могут выполнять одно действие двумя разными способами. То есть ваше предположение о том, что две разные реализации одного интерфейса могут "присваиваться" друг другу, изначально неверно