|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|||||||||||||||||||||
Как реализовать массив объектов Абстрактного класса10.11.2020, 19:07. Показов 5417. Ответов 20
Доброго времени суток!
Есть такое задание: Написать программу на языках С# в которой идёт со следующими геометрическими фигурами: 1.Треугольник 2.Квадрат 3.Прямоугольник. В программе имеется массив фигур, с которым можно сделать следующие операции: 1.Добавить новую фигуру 2.Посчитать периметр у всех фигур 3.Посчитать площадь у всех фигур Для фигуры использовать базовый абстрактный класс фигуры, у которого есть методы посчитать периметр и посчитать площадь фигуры. не понимаю вот пункт ниже: Массив фигур в программе должен быть представлен как массив объектов этого базового класса. Массив фигур должен создаваться и вся работа с ним идёт внутри main. Разъясните, пожалуйста, как реализовать массив объектов. Базовый абстрактный класс:
Класс наследник - Треугольник:
Класс наследник - прямоугольник
Класс наследник - квадрат
Класс - программа ???
0
|
|||||||||||||||||||||
| 10.11.2020, 19:07 | |
|
Ответы с готовыми решениями:
20
Можно ли реализовать наследование абстрактного класса Реализовать абстрактные функции-члены абстрактного базового класса в производных классах
|
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
||||||
| 10.11.2020, 19:34 [ТС] | ||||||
|
Класс квадрат у меня не работает в такой реализации, поэтому унаследую его от Базового класса Figure. Хотя логичнее было бы его наследовать от прямоугольника, но что-то пошло не так...Кстати, если подскажите как унаследовать его от прямоугольника, буду признателен:
0
|
||||||
|
228 / 165 / 110
Регистрация: 09.11.2015
Сообщений: 454
|
|
| 10.11.2020, 19:36 | |
|
m054, а сам класс Rectangle нормально работает? Там в конструкторе ошибка
0
|
|
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|||||||||||||
| 10.11.2020, 19:43 [ТС] | |||||||||||||
|
Добавлено через 4 минуты В общем, пойду учить "мат.часть", можете порекомендовать материалы по работе с абстрактными классами, т.к. в тех материалах что у меня есть, не раскрывается тема работы с массивами объектов абстрактного класса)).
0
|
|||||||||||||
|
228 / 165 / 110
Регистрация: 09.11.2015
Сообщений: 454
|
|
| 10.11.2020, 19:44 | |
|
m054, а что именно не работает?
После наследования два свойства Lenght получаются
0
|
|
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|
| 10.11.2020, 19:47 [ТС] | |
|
метод P() не работает, всегда возвращает 0. После того, как наследовался от Figure, все заработало.
0
|
|
|
Модератор
|
|||
| 10.11.2020, 19:53 | |||
|
Во всех классах нужно из публичных свойств убрать сеттеры. В классе квадрата свойство Length излишне, если наследовать от прямоугольника. Переопределять методы P() и S() тоже не нужно. Но в остальном, вроде, рабочий код... или я чего-то не вижу. Добавлено через 3 минуты Единственное отличие - нельзя создать его экземпляр.
1
|
|||
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|
| 10.11.2020, 20:02 [ТС] | |
|
0
|
|
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|||||||||||
| 11.11.2020, 12:37 [ТС] | |||||||||||
|
1. не пойму как организовать проверку на корректность значений так, чтобы, при вводе некорректных значений, объект не создавался?
Т.е. нужно такой метод организовывать не в классе, например, Triangle, а в Program? Например, так:
2. Массив фигур в программе должен быть представлен как массив объектов этого базового класса. 3. Массив фигур должен создаваться и вся работа с ним идёт внутри main. 4. При создании фигур необходимо осуществлять проверку входных данных на возможность создания данной фигуры и в случае ошибки выдавать соответствующие сообщения. Или подскажите что гуглить? А то, видимо, не те вопросы гуглу задаю))
0
|
|||||||||||
|
Модератор
|
|||||||
| 11.11.2020, 13:28 | |||||||
|
По идее нужно в базовом классе создавать метод-фабрику. Который будет проверять параметры и создавать производные классы, но если знания ООП слабые - реализовать будет сложно. Если по входными данными сразу задаётся требуемая фигура, то задайте в каждом классе статический метод проверяющий параметры и создающий фигуру. Примерно с такой сигнатурой:
0
|
|||||||
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|||||||||||||
| 11.11.2020, 17:58 [ТС] | |||||||||||||
|
Массив фигур в программе должен быть представлен как массив объектов базового класса. Массив фигур должен создаваться и вся работа с ним идёт внутри main. Т.е. если делать так, как Вы мне вчера подсказали:
В С++, например, можно создать указатель на объект, а как в C# это сделать, не понимаю
0
|
|||||||||||||
|
Модератор
|
|||
| 11.11.2020, 18:22 | |||
|
Это же метод базового класса! Если у вас код который вы выложили - будет работать. Если изменили его, то покажите, что у вас за код.
0
|
|||
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|||||||||||||||||||||||||||||||||
| 11.11.2020, 21:20 [ТС] | |||||||||||||||||||||||||||||||||
|
я возвращаюсь к исходному коду, где у меня реализованы только классы. На всякий случай дублирую:
Базовый класс:
Запутался окончательно. для начала, нужно реализовать проверку входных данный, при создании объекта класса-наследника я пытался это реализовать через конструктор, просто добавив условия при которых поля инициализируются (если входные данные корректны). Но это неверный подход, т.к. объект все-равно будет создан c нулевыми значениями полей.
0
|
|||||||||||||||||||||||||||||||||
|
Модератор
|
||||||||||||||||||||||
| 11.11.2020, 22:44 | ||||||||||||||||||||||
0
|
||||||||||||||||||||||
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|||||||
| 12.11.2020, 09:34 [ТС] | |||||||
![]() В Целом с Вашим кодом разобрался, вот только не пойму что делается в этом участке кода:
0
|
|||||||
|
Модератор
|
|||||||
| 12.11.2020, 09:48 | |||||||
Сообщение было отмечено m054 как решение
РешениеЕсли значение перед ним равно null, то присваивается значение после него. Так как периметр и площадь у нас неизменяемы, то их можно вычислить сразу в конструкторе и присвоить внутренней (приватной) переменной и потом возвращать в методах. Но решил показать вам другой альтернативный вариант, тоже часто испоьзуемый. Можно эту же переменную вычислить при первом обращении к методу. В методе проверяется переменная на NULL, если она не null - возвращается её значение. Если она NULL, то сначала присваивается ей значение, а потом оно возвращается. Сделать это можно явным образома через if (в методе S()) или неявным образом через ?? (в методе P()).Может вот так будет понятнее:
1
|
|||||||
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
||
| 12.11.2020, 10:40 [ТС] | ||
|
Большое человеческое спасибо Вам!
![]() Добавлено через 26 минут А, и еще, зачем тип var тут?
0
|
||
|
Модератор
|
||||||||||||
| 12.11.2020, 10:50 | ||||||||||||
|
В этом коде я просто сортирую стороны. a - большая, b и с - меньшии.
Можно так сделать:
0
|
||||||||||||
|
29 / 1 / 0
Регистрация: 25.02.2020
Сообщений: 82
|
|||||||
| 12.11.2020, 12:08 [ТС] | |||||||
|
Вопрос был немного о другом, почему используется именно тип var при объявлении переменных:
Вот и стало любопытно, почему Вы решили использовать именно var в данном контексте. Возможно Вы это сделали по привычке, а возможно в этом есть какой-то смысл?
0
|
|||||||
| 12.11.2020, 12:08 | |
|
Помогаю со студенческими работами здесь
20
Реализовать класс "Динамический массив"
Массив объектов одного класса как поле другого класса Как правильно создать массив объектов текущего класса в методе данного класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|