package com.javarush.task.task12.task1231;
/*
Ненужные абстракции
*/
public class Solution {
public static void main(String[] args) {
Horse horse = new Pegasus();
horse.run();
}
public interface CanFly {
void fly();
}
public static class Horse {
public void run() {
}
}
public static class Pegasus extends Horse implements CanFly {
public void fly() {
}
}
public static abstract class SwimmingPegasus extends Pegasus {
public abstract void swim();
}
}Ivan Zelenkov
28 уровень
Ребят, помогите. Не понимаю почему SwimmingPegasus абстрактный. Это 12 уровень 12 лекция. Большое спасибо если объясните каждый метод подробно почему и как нельзя делать
Решен
Комментарии (17)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
AvrelioEnterprise Java Developer в Cofco International,
28 ноября 2020, 03:59
Абстрактный класс можно только наследовать и создавать нельзя т.е (new)
Если в абстрактном классе есть абстрактный метод эго реализация не нужна
+1
Ivan Zelenkov
28 ноября 2020, 19:35
да, но про абстрактные классы я понял что это как концепт, т.е. что-то общее среди всех классов, а что в этом случае общего SwimmingPegasus. Почему он абстрактный, я бы сделал скорее всего абстрактным Horse, потому что все лошади умеют бегать, это как общее.
0
hidden #2322530
29 ноября 2020, 11:18решение
здесь не совсем удачный пример
в первую очередь абстрактный класс создают для наследования. (так как нельзя создавать объекты абстрактного класса)
абстрактные методы при наследовании надо обязательно переопределить.
в абстрактном классе закладывают каркас состояния и поведения для наследников.
задавая абстрактные методы, ты гарантируешь что все наследники этого абстрактного метода его реализуют.
хороший пример был бы вот такой, мы здесь в абстрактном классе сразу задаём, что каждый наследник (конкретное животное) может бегать (поведение) и у него есть поле скорость (состояние). например это полезно при работе в цикле или в другом методе. куда можно передать любого наследника данного абстрактного класса, и код 100% скомпилируется и отработает правильно. ведь по факту метод runAnimals из примера ниже, не знает кого ему передадут. horse или gepard, но так как класс Animals абстрактный, и у него есть абстрактный метод run(), то у любого переданного объекта в этот метод будет этот метод и его можно вызвать.
+2
hidden #2322530
29 ноября 2020, 11:34решение
абстрактный класс почти как интерфейс, с нюансами.
1) у абстрактного класса есть поля ( у интерфейса нет)
2) можно наследоваться только от одного абстрактного класса (интерфейсом может быть много)
есть ещё разные нюансы, но тебе пока они ни к чему. (типа аннотаций например)
+2
Ivan Zelenkov
30 ноября 2020, 17:46
Спасибо большое
0
Ivan Zelenkov
30 ноября 2020, 18:45
Артем, а как мне вызвать в main методе вот такой абстрактный метод
который принимает объект класса?
я в main написал так его вызов:
0
hidden #2322530
30 ноября 2020, 18:47
перечитай ещё раз то, что я выше писал. а лучше пару раз. и код внимательно разбери.
0
Ivan Zelenkov
30 ноября 2020, 18:51
Все то что ты написал я понимаю
0
Ivan Zelenkov
30 ноября 2020, 18:52
хотя погодь, сейчас еще попробую другим способом
0
Ivan Zelenkov
30 ноября 2020, 18:54
все равно не понимаю что во внутрь передавать
0
hidden #2322530
30 ноября 2020, 18:57
а как ты собирался это реализовать?
public static void runItems(Item item) {
в метод передать Item, внутри метода в другой метод передать так же void attachToPlayer(Item item);
Item, если только внутри одного класса Item есть поле с типом Item
0
Ivan Zelenkov
30 ноября 2020, 18:59
так а что делать, просто ни разу не сталкивался с таким в абстракции, и примеров как таковых с объектом класса внутри не видел
0
hidden #2322530
30 ноября 2020, 19:01
гугли, ютуб, и тд тебе в помощь
0
Ivan Zelenkov
30 ноября 2020, 19:04
я уже задавал везде, может не правильно формулирую. Вот спрашиваю здесь
0
hidden #2322530
30 ноября 2020, 19:06
так я вроде выше в примере отлично показал работу абстрактного класса. сейчас подумав, может статью написать по одному из применений абстрактного класса
0
Ivan Zelenkov
30 ноября 2020, 19:14
да, пример твой отличный, но у меня абстрактный метод имее объект внутри и как его вызвать с метода main я не знаю. У меня более усложненная версия. Найти нигде не могу. Может ты знаешь?
0
hidden #2322530
30 ноября 2020, 19:31
знаю скорее всего. но тебе в этом стоит самому уже разбираться.
0