С Новым годом! Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925

Основы ООП. Создать класс МФУ. От кого мне лучше "унаследоваться"?

27.12.2013, 22:37. Показов 2773. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую!
Для практического закрепления 5й главы Хорстманна решил сделать такую программку

Суперкласс -
Java
1
2
3
4
5
class ОргТехника
{ 
    private String Название;
    private double Вес;
}
От него делаю два подкласса
Java
1
2
3
4
5
class Принтеры extends ОргТехника
{ 
    private int Скорость_печати;
    private int Максимальная_нагрузка;
}
и
Java
1
2
3
4
5
class Сканеры extends ОргТехника
{ 
    private int Скорость_сканирования;
    private int Разрешение_сканирования;
}
Нужен совет:
Мне еще нужно создать класс МФУ с такими полями:
Java
1
2
3
4
5
6
7
class МФУ extends ОргТехника
{ 
    private int Скорость_печати;
    private int Максимальная_нагрузка;    
    private int Скорость_сканирования;
    private int Разрешение_сканирования;
}
От кого мне лучше "унаследоваться"?

Программа должна работать так:
Пользователь вводит, к примеру, скорость сканирования. Программа в ответ ему выводит список всех объектов у которых поле Скорость_сканирования >= той что ввел пользователь.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.12.2013, 22:37
Ответы с готовыми решениями:

Основы ООП. Создание стека через класс
Приветствую всех пользователей форума. Относительно недавно начал осваивать ООП. Было необходимо выполнить следующее задание : нужно...

Изучаю Python, сейчас учу основы ООП, где можно найти задачи по ООП
Скиньте пожалуйста источники с задачами(желательно на русском)

Создать базовый класс Car (машина) и производный класс Lorry (грузовик): ООП ошибки
Создать базовый класс Car (машина), характеризуемый торговой маркой (строка), числом цилиндров, мощностью. Определить методы переназначения...

14
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
28.12.2013, 01:45
reisal78, я бы про интерфейсы подумал. Один для сканера, второй для принтера. А МФУ типа и то и то умеет...
1
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
28.12.2013, 01:51  [ТС]
Понял, интерфейсы это в следующей главе... Отложу пока этот класс.
Спасибо!
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
08.01.2014, 20:00
Корявенькая реализация шаблона Factory, но в целом работает
OfficeTech.java
Java
1
2
3
4
5
6
package easybudda.officetech;
 
abstract class OfficeTech {
    abstract String getName();
    abstract double getWeight();
}

Printer.java
Java
1
2
3
4
5
6
package easybudda.officetech;
 
public interface Printer {
    int printingSpeed();
    int maxLoad();
}

Scanner.java
Java
1
2
3
4
5
6
package easybudda.officetech;
 
public interface Scanner {
    int scanningSpeed();
    int maxResolution();
}

OfficeTechFactory.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package easybudda.officetech;
 
public class OfficeTechFactory {
    private OfficeTechFactory() {}
 
    private static class ThePrinter extends OfficeTech implements Printer {
        @Override
        public String getName() {
            return "SamSebeSung Office technics";
        }
 
        @Override
        public double getWeight() {
            return 3.5; // kg
        }
 
        @Override
        public int printingSpeed() {
            return 5; // pages/min
        }
 
        @Override
        public int maxLoad() {
            return 30000; // pages/month
        }
    }
 
    private static class TheScanner extends OfficeTech implements Scanner {
        @Override
        public String getName() {
            return "Hulio Paccardi co.";
        }
 
        @Override
        public double getWeight() {
            return 2.4;
        }
 
        @Override
        public int scanningSpeed() {
            return 2; // pages/min
        }
 
        @Override
        public int maxResolution() {
            return 2400; // dpi
        }
    }
 
    private static class TheMFU extends OfficeTech implements Printer, Scanner {
        @Override
        public String getName() {
            return "OAO Electronica";
        }
 
        @Override
        public double getWeight() {
            return 10;
        }
 
        @Override
        public int printingSpeed() {
            return 6;
        }
 
        @Override
        public int maxLoad() {
            return 50000;
        }
 
        @Override
        public int scanningSpeed() {
            return 4;
        }
 
        @Override
        public int maxResolution() {
            return 1200;
        }
    }
 
    public static OfficeTech createPrinter() {
        return new ThePrinter();
    }
 
    public static OfficeTech createScanner() {
        return new TheScanner();
    }
 
    public static OfficeTech createMFU() {
        return new TheMFU();
    }
}

TestApplication.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package easybudda.officetech;
 
public class TestApplication {
    public static void main(String[] args) {
        OfficeTech printer = OfficeTechFactory.createPrinter();
        System.out.println("Printer name: " + printer.getName());
        System.out.println("Printer weight: " + printer.getWeight());
        System.out.println("Pages printed per minute: " + ((Printer)printer).printingSpeed());
        System.out.println("Maximum pages per month: " + ((Printer)printer).maxLoad());
        System.out.println();
 
        OfficeTech scanner = OfficeTechFactory.createScanner();
        System.out.println("Scanner name: " + scanner.getName());
        System.out.println("Scanner weight: " + scanner.getWeight());
        System.out.println("Pages scanned per minute: " + ((Scanner)scanner).scanningSpeed());
        System.out.println("Maximum scan resolution" + ((Scanner)scanner).maxResolution());
        System.out.println();
 
        OfficeTech mfu = OfficeTechFactory.createMFU();
        System.out.println("MFU name: " + mfu.getName());
        System.out.println("MFU weight: " + mfu.getWeight());
        System.out.println("MFU pages printed per minute: " + ((Printer)mfu).printingSpeed());
        System.out.println("MFU maximum pages printed per month: " + ((Printer)mfu).maxLoad());
        System.out.println("MFU pages scanned per minute: " + ((Scanner)mfu).scanningSpeed());
        System.out.println("MFU maximum scan resolution: " +((Scanner)mfu).maxResolution());
    }
}
1
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
08.01.2014, 20:18  [ТС]
easybudda, премного благодарен за помощь. =)

Без использования интерфейсов я сделал так. Не посмотрите на недостатки в моем решении?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
09.01.2014, 17:43
Лучший ответ Сообщение было отмечено как решение

Решение

Без интерфейсов коряво -- ничто не закрепляет контракт МФУ. Т.е. если изменится функционал сканера, функционал МФУ останется прежним.

Как правило, такие задачи решаются делегированием во избежание дублирования кода.

Делегирование и интерфейсы:
(естественно, каждый класс должен быть в отдельном файле и все такое...)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
public interface Printer {
    void print();
    double getPrintingSpeed();
}
 
public interface Scanner {
    void scan();
    double getScanningSpeed();
}
 
public interface Mfu extends Printer, Scanner {
}
 
public class GenericPrinter implements Printer {
    private final double printingSpeed;
 
    public GenericPrinter(double printingSpeed) {
        this.printingSpeed = printingSpeed;
    }
 
    @Override
    public void print() {
        System.out.println("I'm printing.");
    }
 
    @Override
    public double getPrintingSpeed() {
        return printingSpeed;
    }
}
 
public class GenericScanner implements Scanner {
    private final double scanningSpeed;
 
    public GenericScanner(double scanningSpeed) {
        this.scanningSpeed = scanningSpeed;
    }
 
    @Override
    public void scan() {
        System.out.println("I'm scanning.");
    }
 
    @Override
    public double getScanningSpeed() {
        return scanningSpeed;
    }
}
 
public class GenericMfu implements Mfu {
    private final Printer printer;
    private final Scanner scanner;
 
    public GenericMfu(Printer printer, Scanner scanner) {
        this.printer = printer;
        this.scanner = scanner;
    }
 
    @Override
    public void print() {
        printer.print();
    }
 
    @Override
    public double getPrintingSpeed() {
        return printer.getPrintingSpeed();
    }
 
    @Override
    public void scan() {
        scanner.scan();
    }
 
    @Override
    public double getScanningSpeed() {
        return scanner.getScanningSpeed();
    }
}
 
public class Test {
    public static void main(String[] args) {
        Mfu mfu = new GenericMfu(new GenericPrinter(1.25), new GenericScanner(2.3));
        mfu.print();
        mfu.scan();
    }
}
3
 Аватар для verylazy
462 / 462 / 71
Регистрация: 26.02.2013
Сообщений: 1,263
09.01.2014, 17:49
ах тыж
я совсем не подумал что можно ведь вот так писать
public interface Mfu extends Printer, Scanner
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
09.01.2014, 17:49  [ТС]
Спасибо, как раз начал с этим разбираться!
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
12.01.2014, 12:00  [ТС]
lemegeton, а как в Вашем решении поступать с общими характеристиками?
Вот допустим вес устройства. Это поле будет и в объекте Принтера, и в объекте Сканера. А как быть с весом объекта МФУ?
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.01.2014, 13:19
Да точно так же. Делегат же.
Можно, например, возвратить сумму весов принтера и сканера или, скажем, задать в конструкторе...

Или общего предка, как сделано у easybudda, если нужно сократить дублирование кода.
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
12.01.2014, 14:40  [ТС]
lemegeton, Все же как то не очень у меня получается осмыслить....

Ведь если в каждом классе я создам поле
Java
1
private double weight;
то создание объекта класса Mfu будет следующим:
Java
1
Mfu mfu = new GenericMfu(new GenericPrinter(1.25, 1.5), new GenericScanner(2.3, 0.8), 1.7);
Получается что в объекта класса МФУ у меня будут хранится лишние поля?
Получать вес МФУ путем сложения весов указанных в объектах принтера и сканера не вариант. (Я же знаю только общий вес устройства, ни один производитель мфу не указывает вес принтера/сканера/факса отдельно.)
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.01.2014, 14:54
Тогда подойдет общий предок.
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
12.01.2014, 15:03  [ТС]
lemegeton, т.е. я так понимаю что если я создам это поле в суперклассе оно же все равно унаследуется и принтерами и сканерами и мфу...
0
 Аватар для lemegeton
4903 / 2696 / 921
Регистрация: 29.11.2010
Сообщений: 5,783
12.01.2014, 15:18
Да, унаследуется.
Если это критично, делегаты использовать не надо. Надо использовать отдельную реализацию. Как у easybudda
0
 Аватар для reisal78
944 / 687 / 230
Регистрация: 28.04.2013
Сообщений: 1,925
12.01.2014, 15:24  [ТС]
Понял, спасибо! =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.01.2014, 15:24
Помогаю со студенческими работами здесь

Что лучше для офиса - МФУ CANON IR 2520 или МФУ Kyocera TASKalfa 180?
Здравствуйте, передо мною стоит выбор кто может посоветовать что лучше выбрать!? МФУ CANON IR 2520 или МФУ Kyocera TASKalfa 180, обои...

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

Задача по ООП (создать класс Alfa)
Ребята, помогите, пожалуйста, с задачей. Второй день долблюсь и не понимаю, что не так. Условие: создать класс Alfa таким образом,...

Php7 ООП как создать класс?
класс settings есть в файле settings.php, файл подключается через require в файл con_index.php. есть проверка того, что класс...

ООП: создать абстрактный класс «Календарь»
Создать абстрактный класс «календарь». Объявить в классе следующие функции: a.GetWeekDay(DateTime dt): WeekDay, определяющую день...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru