Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Наследование и типы / 13 сообщений из 13, страница 1 из 1
11.02.2019, 13:39
    #39772208
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
Всем привет!

Java 8

Есть класс Message
Код: java
1.
2.
3.
4.
5.
6.
7.
public class Message {
    
    private String address;
    private String text;
...

}


Есть класс SmppMessage, наследующий Message
Код: java
1.
2.
3.
4.
5.
6.
public class SmppMessage extends Message {
    
    private String sender;
...
    
}


Есть интерфейс Sender
Код: java
1.
2.
3.
4.
5.
public interface Sender {
    
    void send(Message message);
    
}


Есть класс SmppSender, реализующий интерфейс Sender
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class SmppSender implements Sender{

    @Override
    public void send(Message message) {
        System.out.println(message.getSender());
    }

}


Естественно getSender() на типе Message не доступен, выдаётся ошибка.
Но если в реализации метода send указать тип SmppMessage, то выдаётся ошибка, что метод void send(Message message) не реализован:
Код: java
1.
2.
3.
4.
@Override
    public void send(SmppMessage message) {
        System.out.println(message.getSender());
    }



Классов наследников класса Message будет несколько.
Классов, реализующих интерфейс Sender тоже будет несколько.

Как правильно с точки зрения ООП реализовать это на Java?
...
Рейтинг: 0 / 0
11.02.2019, 13:42
    #39772213
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
Molasar, один из вариантов это создать для наследников свои интерфейсы, добавив свои методы ну и заимпементив их. То бишь получается Message -> SmmpMessage -> SmmpMessageImpl. и в конкретном сендере можно использовать интерфейс SmmpMessage
...
Рейтинг: 0 / 0
11.02.2019, 13:52
    #39772228
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
MolasarНо если в реализации метода send указать тип SmppMessage, то выдаётся ошибка, что метод void send(Message message) не реализован:
Код: java
1.
2.
3.
4.
@Override
    public void send(SmppMessage message) {
        System.out.println(message.getSender());
    }



Какое-то отсутствие критического мышления, от слова вообще. Вы хотя бы свои сообщения один раз прочитайте перед отправкой, иначе лютый треш получается. Или вместо фантазирования реально скомпилируйте приведённый код, тоже на некоторые мысли наведёт.
...
Рейтинг: 0 / 0
11.02.2019, 14:11
    #39772244
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
MolasarКак правильно с точки зрения ООП реализовать это на Java?
generics
...
Рейтинг: 0 / 0
11.02.2019, 14:12
    #39772246
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
Слог страдает согласен.
При компиляции выдается Uncompilable source code - javaapplication2.SmppDeliver is not abstract and does not override abstract method send(javaapplication2.Message) in javaapplication2.SmppSender

alex55555MolasarНо если в реализации метода send указать тип SmppMessage, то выдаётся ошибка, что метод void send(Message message) не реализован:
Код: java
1.
2.
3.
4.
@Override
    public void send(SmppMessage message) {
        System.out.println(message.getSender());
    }



Какое-то отсутствие критического мышления, от слова вообще. Вы хотя бы свои сообщения один раз прочитайте перед отправкой, иначе лютый треш получается. Или вместо фантазирования реально скомпилируйте приведённый код, тоже на некоторые мысли наведёт.
...
Рейтинг: 0 / 0
11.02.2019, 14:14
    #39772249
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
Задача в том, чтобы всё наследовалось от одного интерфейса с методом send(Message message)
TsyklopMolasar, один из вариантов это создать для наследников свои интерфейсы, добавив свои методы ну и заимпементив их. То бишь получается Message -> SmmpMessage -> SmmpMessageImpl. и в конкретном сендере можно использовать интерфейс SmmpMessage
...
Рейтинг: 0 / 0
11.02.2019, 14:18
    #39772254
Tsyklop
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
MolasarЗадача в том, чтобы всё наследовалось от одного интерфейса с методом send(Message message)
Тогда приводить в нужному типу месседжа в конкретной реализации сендера.
...
Рейтинг: 0 / 0
11.02.2019, 14:34
    #39772264
Molasar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
Почему в таком виде преобразование не работает:
Код: java
1.
String sender = (SmppMessage) message.getSender();


А так работает
Код: java
1.
2.
smppMessage = (SmppMessage) message;
String sender = smppMessage.getSender();



TsyklopMolasarЗадача в том, чтобы всё наследовалось от одного интерфейса с методом send(Message message)
Тогда приводить в нужному типу месседжа в конкретной реализации сендера.
...
Рейтинг: 0 / 0
11.02.2019, 14:46
    #39772276
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
MolasarПочему в таком виде преобразование не работает:скобки?
...
Рейтинг: 0 / 0
11.02.2019, 16:15
    #39772350
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
chpashaMolasarКак правильно с точки зрения ООП реализовать это на Java?
generics

Тут выше человек уже дал один из правильных ответов:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
public interface Sender<T extends Message> {
    
    void send(T message);
    
}

public SenderImpl<T extends Message> implements Sender<T>
    
    public void send(T message) {
        System.out.println(message.getSender());
    }

}


public class SmppSender implements Sender<SmppMessage>{

  

}
...
Рейтинг: 0 / 0
11.02.2019, 16:16
    #39772353
13-й Пилигрим
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
interface Sender<T extends Message> {
    void send(T message);
}

class SmppSender implements Sender<SmppMessage> {
    @Override
    public void send(SmppMessage message) {
        System.out.println(message.getSender());
    }
}
...
Рейтинг: 0 / 0
11.02.2019, 16:16
    #39772354
Озверин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
Озверин,

последнюю конструкцию конечно же написать так:

Код: java
1.
2.
3.
4.
5.
public class SmppSender extends SenderImpl<SmppMessage>{

  

}
...
Рейтинг: 0 / 0
12.02.2019, 15:27
    #39772904
alex55555
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наследование и типы
MolasarПри компиляции выдается Uncompilable source code - javaapplication2.SmppDeliver is not abstract and does not override abstract method send(javaapplication2.Message) in javaapplication2.SmppSender
Ну вот. А сразу точно скопировать текст не судьба была? Зачем отсебятину городить?

А теперь просто переведите фразу из сообщения об ошибке. Там однозначно указано, что с вашим классом не так. Если вам всё ещё непонятно - сравните по буквам всё то, на что указывает ошибка со всем тем, что написали вы. И сразу всё станет ясно - буквы не сходятся. Но почему простое расхождение в буквах вы не можете увидеть самостоятельно?

Вообще при изучении чего бы то ни было нужно хоть немного напрягаться. Если не будете, то всё за вас никто делать не будет. Даже если и подскажут чего (а часто подсказывают ту ещё отсебятину), то кто потом в реальной жизни за вас программы будет писать?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Наследование и типы / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]