С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
 Аватар для Serg22
107 / 107 / 58
Регистрация: 04.03.2013
Сообщений: 479

Совет по архитектуре программы

06.03.2015, 21:05. Показов 1717. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задание: Смоделировать экосистему Аквариум. В нем существуют травоядные рыбы, хищники, препятствия, водорости.

Использую композицию (в аквариум заношу экземпляры всех остальных классов).

Как лучше реализовать класс травоядных и хищных рыб? Наследование от абстрактного класса Fish? или же интерфейс?

Общие методы: growUp(), move(), die(), eat(но тут разные параметры, у травоядных - WaterPlant, у хищных - HerbivorousFish), reproduce(так же параметры отличаются).
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.03.2015, 21:05
Ответы с готовыми решениями:

нужен совет по архитектуре программы
В офисе работает 10 - 100 сотрудников (задается случайно), каждый из них имеет одну или более одной должности (задается случайно для...

Нужен небольшой совет по архитектуре
Необходимо было организовать работу с парой тысяч объектов в параллельном режиме. Все исключительные ситуации вызывают исключения которые...

ООП и БД. Нужен совет, пояснение по архитектуре
Добрый день, друзья. При попытке написания теплого, правильного, лампового кода для приложения с бд столкнулся с непониманием по следующему...

26
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
06.03.2015, 21:31
Serg22, для рыб общий базовый класс. Для еды интерфейс. Почему у метода reproduce отличаются параметры?
1
 Аватар для Serg22
107 / 107 / 58
Регистрация: 04.03.2013
Сообщений: 479
07.03.2015, 21:22  [ТС]
Ошибся( Разные возвращаемые типы у reproduce(). Куда его добавлять? Или реализовать в каждом классе отдельно?

Вот с классом получилось Fish
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public abstract class Fish {
    /**
     * Метод роста рыб
     */
     void growUp(){
 
     };
 
    /**
     * Метод движения рыб
     */
     void move(){};
 
    /**
     * Метод смерти рыб
     */
     void die(){};
}
, а с интерфейсом не могу разобраться. Их два нужно? Параметры ведь я не могу менять в методе eat()...
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.03.2015, 00:52
Serg22, методы должны быть абстрактными
Интерфейс один. Зачем два? reproduce тоже должен сидеть в абстрактном классе
1
 Аватар для Serg22
107 / 107 / 58
Регистрация: 04.03.2013
Сообщений: 479
08.03.2015, 13:57  [ТС]
KEKCoGEN, просто у меня же возвращаемые значения отличаются в методе reproduce() , придется написать два разноименных метода? одним никак не обойтись ?
И для еды в интерфейсе как у меня получится обойтись одним интерфейсом если у меня разные параметры метода eat() для хищных и нехищных рыб?
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.03.2015, 16:48
Serg22, думаю вам нужно почитать про интерфейсы. Реализаций может быть много, но интерфейс все равно один.
0
 Аватар для Serg22
107 / 107 / 58
Регистрация: 04.03.2013
Сообщений: 479
08.03.2015, 17:37  [ТС]
KEKCoGEN, Вы имеет в виду такой интерфейс?
Java
1
2
interface Test<T>{
T reproduce();
и уже при имплементировании писать
Java
1
public class HerbivorousFish implements Test<HerbivorousFish> {}
?

Добавлено через 11 минут
Вот еще что пришло в голову: Не используя интерфейс, я все методы помещу в абстрактный класс указав его как
Java
1
2
3
4
5
6
7
8
9
10
11
abstract class Fish<K,E>{
 
abstract void growUp();
 
abstract void move();
 
abstract  void die();
 
abstract T reproduce();
 
abstract void eat(E e);}
Это будет верно с точки зрения ООП? я просто не пойму почему мы одни методы помещаем в абстрактный класс, а другие в интерфейс
1
 Аватар для Sanan07
284 / 264 / 173
Регистрация: 27.07.2014
Сообщений: 584
08.03.2015, 18:50
Serg22, Абстрактный класс нужен если между классами есть понятие IS-A т.е. Cat is a Animal. А для интерфейса этого не надо,вы объявляете интерфейс публичным и во всем проекте для какого класса необходимо иметь такие методы он просто его реализует этот интерфейс
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
08.03.2015, 18:50
Цитата Сообщение от Serg22 Посмотреть сообщение
я просто не пойму почему мы одни методы помещаем в абстрактный класс, а другие в интерфейс
Я ни в коем случае не настаиваю, но мне кажется что если у метода есть только одна, одинаковая для всех потомков реализация - то его надо выносить в абстрактный класс.
Если у наследников абстрактного класса должны быть разные реализации метода то используем не метод, а интерфейс, причем пишем что-то типа
abstract class MyFish implements MyLolInterface {}
что бы потомки принудительно реализовывали методы из интерфейса

надеюсь не очень мутно написал
1
 Аватар для Serg22
107 / 107 / 58
Регистрация: 04.03.2013
Сообщений: 479
08.03.2015, 18:59  [ТС]
Sanan07, в моем случае хищные и нехищные рыбы являются (is-a) подтипами Fish, т.е в даном случае использую абстрактный класс?
0
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
08.03.2015, 19:10
и я бы не делал абстрактными методы типа move() die(), все рыбы двигаются и умирают, проще один раз реализовать эти методы прямо в абстрактном классе и все
а Fish да, делать абстрактным классом

если четкие парни меня поправят если не прав то скажу спасибо, потому что сам учусь на таких темах
1
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.03.2015, 19:13
Цитата Сообщение от Serg22 Посмотреть сообщение
в моем случае хищные и нехищные рыбы являются (is-a) подтипами Fish, т.е в даном случае использую абстрактный класс?
Да.
Так же любая рыба вне зависимости от вида умеет плавать, есть и размножаться. Поэтому реализации этих методов должны быть в базовом классе.
Все рыбы едят еду. Еда может быть разная, но какая бы она не была, это все равно еда. Поэтому еда это интерфейс.
Когда рыба размножается, она воспроизводит рыбу. Рыба неможет воспроизвести тумбочку поэтому этот метод так же сидит в базовом классе и возаращает рыбу.
1
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
08.03.2015, 19:17
Цитата Сообщение от KEKCoGEN Посмотреть сообщение
Поэтому еда это интерфейс.
вот тут не понял, почему не метод в абстрактном классе?
0
 Аватар для Sanan07
284 / 264 / 173
Регистрация: 27.07.2014
Сообщений: 584
08.03.2015, 19:34
Для конкретного случая одного абстрактного класса Fish вполне достаточно. Интерфейс надо использовать, если в проекте есть классы не связанные друг с другом, но имеют одинаковые методы. т.е. если были не только рыбы, но и например люди можно было бы создать интефейс с методами eat,die,reproduce и т.д. далее создать абстрактные классы Fish и Human, а дальше уже конкретные типа WaterPlantFish или Woman.
1
 Аватар для Serg22
107 / 107 / 58
Регистрация: 04.03.2013
Сообщений: 479
08.03.2015, 23:25  [ТС]
Всем большое спасибо за разъяснения.
Как я понял сделать необходимо так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public abstract class Fish {
 
protected int CurrentAge;
 
protected boolean sex;
 
protected int hunger;
 
public   void growUp(){CurrentAge++;};
 
public void move(){/*some code here*/};
 
public void die(){/*some code here*/};
 
public boolean whatSex(){return sex;};
 
public abstract Fish reproduce();// вот здесь я так и не понял как реализовать его в 
//базовом классе дабы он не был абстрактным, а в подклассах
// возвращал тип PredatoryFish и WaterPlantFish, а не просто Fish.
//Поэтому просто его переопределяю в подклассах.
}
Интерфейс для еды:
Java
1
2
3
public interface Food<E> {
 void eat(E e);
}
Подкласс WaterPlantFish (для predatory по аналогии):
Java
1
2
3
4
5
6
7
8
9
10
public class WaterPlantFish extends Fish implements Food<WaterPlant> {
 @Override
    public WaterPlantFish reproduce() {
        return new WaterPlantFish();
    }
 @Override
    public void eat(WaterPlant waterPlant) {
        waterPlant.eaten();
    }
}
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.03.2015, 23:34
Цитата Сообщение от Паблито Посмотреть сообщение
вот тут не понял, почему не метод в абстрактном классе?
потому что едой может быть водоросль и другая рыба. У них нет общего предка с которым есть связь is-a поэтому интерфейс

Добавлено через 7 минут
Serg22, про еду должно быть наоборот класс WaterPlant должен реализовывать интерфейс Food. Параметризация интерфейса тут ненужна. Метод еды должен выглядеть как

Java
1
2
3
public void eat(Food food) {
        food.eaten();
    }
и должен быть описан в базовом классе рыбы

В вашем примере хищная рыба может съесть другую рыбу и тогда нехищная рыба в реализации метода интерфейса вызовет метод die()


А у вас еда ест сама себя.
1
 Аватар для Serg22
107 / 107 / 58
Регистрация: 04.03.2013
Сообщений: 479
08.03.2015, 23:46  [ТС]
KEKCoGEN, у меня метод eaten() существует только в WaterPlant. При реализации интерфейса Food классом Waterplant я не могу обратиться к food.eaten() в методе eat так само как при реализации в абстрактном Fish() интерфейс Food. Или я Вас не так понял..
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
08.03.2015, 23:53
Serg22, в интерфейсе Food должен быть метод eaten
У вас там метод eat и это ошибочно. Еда неможет есть. Она может быть только съеденна.
0
 Аватар для Serg22
107 / 107 / 58
Регистрация: 04.03.2013
Сообщений: 479
09.03.2015, 00:04  [ТС]
Что то уже совсем туплю(
Метод в интерфейсе:
Java
1
  void eaten();
А в классах WaterPlant и Fish реализую его как
Java
1
public void eaten(){/*some code*/}
И добавляю в Fish метод
Java
1
void eat(Food food){food.eaten();}
Верно ?)
0
Эксперт Java
 Аватар для KEKCoGEN
2399 / 2224 / 565
Регистрация: 28.12.2010
Сообщений: 8,672
09.03.2015, 00:05
Java
1
2
3
public interface Food {
    void eaten();
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class Fish implements Food {
 
    protected void die() {
        System.out.println("I'm dying");
    }
 
    @Override
    public void eaten() {
        die();
 
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
public class WaterPlant implements Food {
    
    private int remainingFood = 10;
 
    @Override
    public void eaten() {
        remainingFood--;
        if(remainingFood == 0) {
            die();
        }
    }
}
Если водоросль тоже умирает, можно сделать ещё один абстрактный класс SeaUnit какой нибудь у которого будет этот метод и переделать иерархию.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.03.2015, 00:05
Помогаю со студенческими работами здесь

Нужен совет по архитектуре многопоточного приложения
Здравствуйте. Есть приложение WPF MVVM, которое обрабатывает файлы. Так как обработка файлов занимает время, то хотелось бы информировать...

Вопрос по архитектуре программы
вопрос в том как лучше написать, обрабатывать исключение и правильно ли делать подобным образом запись и чтение

Совет по структуре программы
Добрый день! Помогите советом по структуре (алгоритму) программы. Задача: есть множество плат, которые опрашивает Распберри Пи....

Нужен совет по написанию программы на C#
Здравствуйте. Так как считаю мнения людей сидящих на этом форуме авторитетным, пришел за советом сюда. Я не давно начал изучать C# и...

Нужен совет по созданию программы
Не подскажите, как на языке си оформить задачу, в которой пользователю предлагается выбор по типу: &quot;Если вы хотите то-то, нажмите 1,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru