| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Правильность кода и наследование от класса carrier |
| Автор: mastermedia 17.1.2012, 21:53 | ||||||||
| Я реализовал класс транспортное средство и два класса автомобиль и поезд, которые наследуются от класса транспортное средство. Я использовал в программе абстрактные классы, методы и виртуальные методы. Проверьте, пожалуйста, насколько корректно я реализовал данную программу. Класс Carrier
Класс Car
Класс Train
Класс Program
|
| Автор: mastermedia 17.1.2012, 23:41 | ||||
Cheloveck, это не для преподавателя, а для себя делаю.
Поясни этот момент, а то я не сильно понял почему это плохо?
Это я делаю на случай, если пользователь не правильно введет данные. Скорость не должна быть отрицательная, поэтому требую вводить ее заново пока не будет больше нуля. |
| Автор: Cheloveck 17.1.2012, 23:48 |
Когда ты пишешь класс, ты не должен полагаться на логику его наследников. Предполагается, что твой класс является самостоятельной сущностью полностью обслуживающий себя сам. Абстрактные методы нужны, как правило, для двух целей: 1. Получить данные, которыми базовый класс не может владеть. 2. Обработать данные, которые базовый класс не знает, как обработать. При этом результат обработки должен приходить из вызова этого метода (возвращаемое значение или out параметр), но никак не через изменение состояния объекта. Состояние базового класса можно менять из дочерних только в том случае, если базовый класс этого просит явно. Защищённые переменные способствуют излишней осведомлённости потомков, потом появляются большие проблемы. Разрабатывая класс нельзя думать о его потомках. Это первое, что ты должен запомнить. Даже абстрактный класс является самостоятельным. |
| Автор: mastermedia 17.1.2012, 23:50 | ||||
Тут имеется виду вместо свойств TypeCar, Model написал обычные переменные?
Шилдт у себя в примерах использовал. |
| Автор: Cheloveck 17.1.2012, 23:51 | ||||
Все данные вводятся в контроллер. Классы, содержащие бизнес-логику не должны общаться с пользователем. Контроллер в примитивном случае -- метод Main. Если значение не верное -- бросай исключение, контроллер (или кто-то ещё) поймают его и всё спросят за тебя. Это проблема не логики, а уровня взаимодействия с пользователем. Добавлено через 2 минуты и 13 секунд
Тут имеется введу чрезвычайная разговорчивость класса Это не повод делать то же самое ;-) |
| Автор: mastermedia 18.1.2012, 00:02 | ||
В примитивном случае, в моем, я должен требовать от пользователя данные вводить данные до тех пор пока он не ведет правильные в методе Main, а из класса убрать сообщения?
Вместо свойств мне использовать для изменения скорости метод? |
| Автор: Cheloveck 18.1.2012, 00:50 | ||||
Да.
Да. Но ничего не менять там, где это не очевидно, например при валидации. |
| Автор: Cheloveck 18.1.2012, 02:13 | ||
Вообще, твой пример не очень хорошо демонстрирует наследование. Вот код, притянутый за уши, чтобы хоть как-то соответствовать топику, который решает твою задачу. Немного расширен, дабы не было дублирования кода. Плюс все данные вводит пользователь.
|
| Автор: mastermedia 18.1.2012, 20:17 |
| Cheloveck, я не пойму почему в некоторых случаях не нужно использовать свойство, а просто переменную? Например, в случае переменной Model. Ведь свойства нужны для того чтобы улучшить доступ к значению и как написанно в Шилдте это удобнее, чем использовать методы get и set. Тем более, если при организации метода вывода вместе использовать в выводе свойства и переменные, то это как я понимаю, усложнит отладку кода. |
| Автор: Cheloveck 18.1.2012, 21:16 |
| Свойства -- это ни что иное как методы доступа. Их назначение -- дать возможность контроля данных или ограничить чтение/запись. Вызовы методов всегда связаны с накладными расходами (пусть и не большими). Также свойства предоставляют возможность сделать их виртуаьными, что зачастую упрощает синтаксис использования свойств в отличаи от классических методов. Назначение переменных -- хранить состояние объекта. При использовании auto-implemented свойств автоматически генерируется переменная, хранящая значение свойства, хотя создаётся ложное впечатление того, что свойство само хранит значение. |