![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| mastermedia |
|
||||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 31.10.2010 Репутация: нет Всего: нет |
Я реализовал класс транспортное средство и два класса автомобиль и поезд, которые наследуются от класса транспортное средство. Я использовал в программе абстрактные классы, методы и виртуальные методы. Проверьте, пожалуйста, насколько корректно я реализовал данную программу.
Класс Carrier
Класс Car
Класс Train
Класс Program
|
||||||||
|
|||||||||
| Cheloveck |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Почему первое -- свойство, а второе -- переменная. Защищённые переменные в базовом классе -- плохая практика. Используй свойства и методы. Туда же. плюс начинает меняться нотация имён -- очень не профессионально.
1. Никаких вопросов этот класс, тем более этот метод задавать не должен. Это противоречит логике. 2. Имя метода говорит: "проверить скорость". На практике мы видим бесконечный цикл. Если метод называется ValidateXXX, то ему должно передаться значение, которое он должен валидировать, но никак уж не запрашивать какие-то данные у пользователя. Тут вообще свойство на фиг не нужно. Должна быть просто переменная. Ах вот как из бесконечного цикла выходим. Оказывается, базовый класс знает об устройстве своих наследников. Если это покажешь своему преподавателю -- получишь неуд сразу же.
Тут проблемы с русским языком. И, снова, класс начинает говорить и слушать, когда не должен. То есть, при присваивании значения свойству, внезапно, появляется запрос пользователю. Это пи***ц. Всё те же проблемы. Опять приватное свойство вместо переменной. Полное дублирование кода говорит о том, что он должен быть в базовом классе.
Опять. Я бы поставил 1 по 5-ти бальной шкале. Удачи! -------------------- ![]() |
||||||||
|
|||||||||
| mastermedia |
|
||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 31.10.2010 Репутация: нет Всего: нет |
Cheloveck, это не для преподавателя, а для себя делаю.
Поясни этот момент, а то я не сильно понял почему это плохо?
Это я делаю на случай, если пользователь не правильно введет данные. Скорость не должна быть отрицательная, поэтому требую вводить ее заново пока не будет больше нуля. Это сообщение отредактировал(а) mastermedia - 17.1.2012, 23:46 |
||||
|
|||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Когда ты пишешь класс, ты не должен полагаться на логику его наследников. Предполагается, что твой класс является самостоятельной сущностью полностью обслуживающий себя сам. Абстрактные методы нужны, как правило, для двух целей: 1. Получить данные, которыми базовый класс не может владеть. 2. Обработать данные, которые базовый класс не знает, как обработать. При этом результат обработки должен приходить из вызова этого метода (возвращаемое значение или out параметр), но никак не через изменение состояния объекта. Состояние базового класса можно менять из дочерних только в том случае, если базовый класс этого просит явно. Защищённые переменные способствуют излишней осведомлённости потомков, потом появляются большие проблемы. Разрабатывая класс нельзя думать о его потомках. Это первое, что ты должен запомнить. Даже абстрактный класс является самостоятельным. -------------------- ![]() |
|||
|
||||
| mastermedia |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 31.10.2010 Репутация: нет Всего: нет |
Тут имеется виду вместо свойств TypeCar, Model написал обычные переменные?
Шилдт у себя в примерах использовал. |
|||
|
||||
| Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Все данные вводятся в контроллер. Классы, содержащие бизнес-логику не должны общаться с пользователем. Контроллер в примитивном случае -- метод Main. Если значение не верное -- бросай исключение, контроллер (или кто-то ещё) поймают его и всё спросят за тебя. Это проблема не логики, а уровня взаимодействия с пользователем. Добавлено через 2 минуты и 13 секунд
Тут имеется введу чрезвычайная разговорчивость класса Это не повод делать то же самое ;-) -------------------- ![]() |
||||
|
|||||
| mastermedia |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 31.10.2010 Репутация: нет Всего: нет |
В примитивном случае, в моем, я должен требовать от пользователя данные вводить данные до тех пор пока он не ведет правильные в методе Main, а из класса убрать сообщения?
Вместо свойств мне использовать для изменения скорости метод? |
|||
|
||||
| Cheloveck |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Да.
Да. Но ничего не менять там, где это не очевидно, например при валидации. -------------------- ![]() |
||||
|
|||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Вообще, твой пример не очень хорошо демонстрирует наследование. Вот код, притянутый за уши, чтобы хоть как-то соответствовать топику, который решает твою задачу. Немного расширен, дабы не было дублирования кода. Плюс все данные вводит пользователь.
-------------------- ![]() |
|||
|
||||
| mastermedia |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 31.10.2010 Репутация: нет Всего: нет |
Cheloveck, я не пойму почему в некоторых случаях не нужно использовать свойство, а просто переменную? Например, в случае переменной Model. Ведь свойства нужны для того чтобы улучшить доступ к значению и как написанно в Шилдте это удобнее, чем использовать методы get и set. Тем более, если при организации метода вывода вместе использовать в выводе свойства и переменные, то это как я понимаю, усложнит отладку кода.
|
|||
|
||||
| Cheloveck |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1578 Регистрация: 26.7.2008 Где: Тула Репутация: нет Всего: 32 |
Свойства -- это ни что иное как методы доступа. Их назначение -- дать возможность контроля данных или ограничить чтение/запись. Вызовы методов всегда связаны с накладными расходами (пусть и не большими).
Также свойства предоставляют возможность сделать их виртуаьными, что зачастую упрощает синтаксис использования свойств в отличаи от классических методов. Назначение переменных -- хранить состояние объекта. При использовании auto-implemented свойств автоматически генерируется переменная, хранящая значение свойства, хотя создаётся ложное впечатление того, что свойство само хранит значение. -------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |