powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Наследование и типы
13 сообщений из 13, страница 1 из 1
Наследование и типы
    #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
Наследование и типы
    #39772213
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Molasar, один из вариантов это создать для наследников свои интерфейсы, добавив свои методы ну и заимпементив их. То бишь получается Message -> SmmpMessage -> SmmpMessageImpl. и в конкретном сендере можно использовать интерфейс SmmpMessage
...
Рейтинг: 0 / 0
Наследование и типы
    #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
Наследование и типы
    #39772244
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarКак правильно с точки зрения ООП реализовать это на Java?
generics
...
Рейтинг: 0 / 0
Наследование и типы
    #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
Наследование и типы
    #39772249
Molasar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задача в том, чтобы всё наследовалось от одного интерфейса с методом send(Message message)
TsyklopMolasar, один из вариантов это создать для наследников свои интерфейсы, добавив свои методы ну и заимпементив их. То бишь получается Message -> SmmpMessage -> SmmpMessageImpl. и в конкретном сендере можно использовать интерфейс SmmpMessage
...
Рейтинг: 0 / 0
Наследование и типы
    #39772254
Tsyklop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MolasarЗадача в том, чтобы всё наследовалось от одного интерфейса с методом send(Message message)
Тогда приводить в нужному типу месседжа в конкретной реализации сендера.
...
Рейтинг: 0 / 0
Наследование и типы
    #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
Наследование и типы
    #39772276
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MolasarПочему в таком виде преобразование не работает:скобки?
...
Рейтинг: 0 / 0
Наследование и типы
    #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
Наследование и типы
    #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
Наследование и типы
    #39772354
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Озверин,

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

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

  

}
...
Рейтинг: 0 / 0
Наследование и типы
    #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
13 сообщений из 13, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Наследование и типы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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