Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Наследование и типы  [new]
Molasar
Member

Откуда:
Сообщений: 541
Всем привет!

Java 8

Есть класс Message
public class Message {
    
    private String address;
    private String text;
...

}

Есть класс SmppMessage, наследующий Message
public class SmppMessage extends Message {
    
    private String sender;
...
    
}

Есть интерфейс Sender
public interface Sender {
    
    void send(Message message);
    
}

Есть класс SmppSender, реализующий интерфейс Sender
public class SmppSender implements Sender{

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

}

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


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

Как правильно с точки зрения ООП реализовать это на Java?
11 фев 19, 13:39    [21806352]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
Tsyklop
Member

Откуда: Украина
Сообщений: 816
Molasar, один из вариантов это создать для наследников свои интерфейсы, добавив свои методы ну и заимпементив их. То бишь получается Message -> SmmpMessage -> SmmpMessageImpl. и в конкретном сендере можно использовать интерфейс SmmpMessage
11 фев 19, 13:42    [21806359]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
alex55555
Member

Откуда:
Сообщений: 1490
Molasar
Но если в реализации метода send указать тип SmppMessage, то выдаётся ошибка, что метод void send(Message message) не реализован:
@Override
    public void send(SmppMessage message) {
        System.out.println(message.getSender());
    }


Какое-то отсутствие критического мышления, от слова вообще. Вы хотя бы свои сообщения один раз прочитайте перед отправкой, иначе лютый треш получается. Или вместо фантазирования реально скомпилируйте приведённый код, тоже на некоторые мысли наведёт.
11 фев 19, 13:52    [21806381]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
chpasha
Member

Откуда:
Сообщений: 7520
Molasar
Как правильно с точки зрения ООП реализовать это на Java?

generics
11 фев 19, 14:11    [21806411]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
Molasar
Member

Откуда:
Сообщений: 541
Слог страдает согласен.
При компиляции выдается Uncompilable source code - javaapplication2.SmppDeliver is not abstract and does not override abstract method send(javaapplication2.Message) in javaapplication2.SmppSender

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


Какое-то отсутствие критического мышления, от слова вообще. Вы хотя бы свои сообщения один раз прочитайте перед отправкой, иначе лютый треш получается. Или вместо фантазирования реально скомпилируйте приведённый код, тоже на некоторые мысли наведёт.
11 фев 19, 14:12    [21806413]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
Molasar
Member

Откуда:
Сообщений: 541
Задача в том, чтобы всё наследовалось от одного интерфейса с методом send(Message message)
Tsyklop
Molasar, один из вариантов это создать для наследников свои интерфейсы, добавив свои методы ну и заимпементив их. То бишь получается Message -> SmmpMessage -> SmmpMessageImpl. и в конкретном сендере можно использовать интерфейс SmmpMessage
11 фев 19, 14:14    [21806416]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
Tsyklop
Member

Откуда: Украина
Сообщений: 816
Molasar
Задача в том, чтобы всё наследовалось от одного интерфейса с методом send(Message message)

Тогда приводить в нужному типу месседжа в конкретной реализации сендера.
11 фев 19, 14:18    [21806425]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
Molasar
Member

Откуда:
Сообщений: 541
Почему в таком виде преобразование не работает:
String sender = (SmppMessage) message.getSender();

А так работает
smppMessage = (SmppMessage) message;
String sender = smppMessage.getSender();


Tsyklop
Molasar
Задача в том, чтобы всё наследовалось от одного интерфейса с методом send(Message message)

Тогда приводить в нужному типу месседжа в конкретной реализации сендера.
11 фев 19, 14:34    [21806446]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 36512
Molasar
Почему в таком виде преобразование не работает:
скобки?
11 фев 19, 14:46    [21806464]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
chpasha
Molasar
Как правильно с точки зрения ООП реализовать это на Java?

generics


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

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>{

  

}
11 фев 19, 16:15    [21806593]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
13-й Пилигрим
Member

Откуда:
Сообщений: 137
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());
    }
}
11 фев 19, 16:16    [21806596]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
Озверин
Member

Откуда: Ростов-на-Дону
Сообщений: 4785
Озверин,

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

public class SmppSender extends SenderImpl<SmppMessage>{

  

}
11 фев 19, 16:16    [21806597]     Ответить | Цитировать Сообщить модератору
 Re: Наследование и типы  [new]
alex55555
Member

Откуда:
Сообщений: 1490
Molasar
При компиляции выдается Uncompilable source code - javaapplication2.SmppDeliver is not abstract and does not override abstract method send(javaapplication2.Message) in javaapplication2.SmppSender

Ну вот. А сразу точно скопировать текст не судьба была? Зачем отсебятину городить?

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

Вообще при изучении чего бы то ни было нужно хоть немного напрягаться. Если не будете, то всё за вас никто делать не будет. Даже если и подскажут чего (а часто подсказывают ту ещё отсебятину), то кто потом в реальной жизни за вас программы будет писать?
12 фев 19, 15:27    [21807522]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить