Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как корректно реализовать метод? 
:(
    Опции темы
mastermedia
Дата 19.1.2012, 22:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 31.10.2010

Репутация: нет
Всего: нет



Мне по заданию нужно, чтобы метод LiftingPower() был абстрактым. Как корректнее мне реализовать  метод LiftingPower() в классе Motorcycle? Метод должен устанавливать грузоподъемность, но перед этим спрашивать про наличие коляски у мотоцикла. Если ее нету, то присваивать грузоподьемности значение 0. Мой вариант реализации метода мне не сильно нравиться.
Код

    abstract class Carrier
    {
        private string model;
        private string number;
        private double speed;
        protected double liftPower;

        private bool SpeedIsNotCorrect(double tempSpeed)
        {
            return tempSpeed > 0.0;
        }

        private bool ModelIsNotCorrect(string tempModel)
        {
            return String.IsNullOrEmpty(tempModel);
        }

        private bool NumberIsNotCorrect(string tempNumber)
        {
            return String.IsNullOrEmpty(tempNumber);
        }

        public string Model
        {
            get
            {
                return model;
            }

            set
            {

                do
                {
                    model = value;
                }while(ModelIsNotCorrect(model));
            }
        }

        public double Speed
        {
            get
            {
                return speed;
            }

            set
            {
                do
                {
                    speed = value;
                }while(!SpeedIsNotCorrect(speed));
            }
        }

        public string Number
        {
            get
            {
                return number;
            }

            set
            {
                do
                {
                    number = value;
                } while (NumberIsNotCorrect(number));
            }
        }

        abstract public void DecsribeCarrier();
        abstract public double LiftingPower();
    }
class Car : Carrier
    {
        public Car(string mod, string num, double lPower) 
        {
            Model = mod;
            Number = num;
            liftPower = lPower;
        }

        public override double LiftingPower()
        {
            return liftPower; 
        }

        public override void DecsribeCarrier()
        {
            Console.WriteLine("Это легковая машина марки {0} с номером {1} имеет скорость {2} км/час. ", Model, Number, Speed);
        }
    }

class Motorcycle : Carrier
    {
        public Motorcycle(string mod, string num)
        {
            Model = mod;
            Number = num;
        }

        
        public override void LiftingPower()
        {
            Console.WriteLine("К мотоциклу прицеплена каляска? - y/n");
            string avaibalitySideCar = Console.ReadLine();
            if (avaibalitySideCar == "y")
            {
                liftPower = 0;
            }
            else
            {
                liftPower = 2;
            }
            Console.WriteLine("Средняя грузодъемность мотоцикла {0} тон", liftPower); 
            return liftPower;
        }

        public override void DecsribeCarrier()
        {
            Console.WriteLine("Это мотоцикл марки {0} с номером {1} имеет скорость {2}", Model, Number, Speed);
        }
    }

PM MAIL   Вверх
Экскалупатор
Дата 20.1.2012, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



mastermedia, как по мне так мне вообще не нравится то как у тебя написано
повторюсь так писать нельзя:
Код

 public string Number
        {
            get
            {
                return number;
            }
            set
            {
                do
                {
                    number = value;
                } while (NumberIsNotCorrect(number));
            }
        }


про мотоцикл:
почему мотоцикл "пытается узнать" есть ли у него коляска только когда у него спрашивают про вес? это же не логично. наличие коляски это свойство мотоцикла. оно уже должно быть определено. передай в конструктор флаг, ну или установи как то по другому это свойство. а потом при установке веса проверь его. но в любом случае ВВОДИТЬ ДАННЫЕ В СВОЙСТВАХ НЕЛЬЗЯ!!!
PM MAIL ICQ   Вверх
mastermedia
Дата 20.1.2012, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 31.10.2010

Репутация: нет
Всего: нет



Экскалупатор,  почему в свойствах нельзя вводить данные, ведь акссесор get для этого и создан, для установки значений? Свойства заменяют методы get и set. А если я не прав, то поправь пожалуйста и тогда как именно нужно вводить значения?

Это сообщение отредактировал(а) mastermedia - 20.1.2012, 09:39
PM MAIL   Вверх
Экскалупатор
Дата 20.1.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



свойство предназначено для того что бы можно было сделать какие то действия с переменной, при этом вызывающий код не знает что это свойство или public переменная. 
вызывающий код просто пишет class.Variable = 5; при это он даже представить себе не может что внутри свойства, ВНЕЗАПНО, будет вызван код который попытается ввести туда еще одну, другую переменную. Представь себе такую ситуацию что у тебя есть метод который создает два экземпляра разных классов, по очереди, и у каждого из них есть общее(по смыслу) свойство которое по условию программы должно быть одинаково для обоих экземпляров. но в твоем случае, когда в set вызывается метод устанавливающий значение, в классах могут оказаться разные значения и как в таком случае нужно будет выкручиваться из положения? писать кучу лишнего кода, которого можно было не писать если бы свойство работало так как ему положено!
задача этих set & get, не в том что бы вызывать какую то логику, а только что бы провалидировать переданное значение, но ни в коем случае не изменять его, я еще пойму замену на 0, когда свойство не может хранить отрицательные значения, но вызывать диалог с пользователем и говорить введи другое значение это уже перебор.
 я конечно понимаю, в них можно даже работу с сетью запихнуть или сохранение в базу, язык это позволяет, но с точки зрения логики и удобства это будут совершенно не очевидные действия. только представь себе человека который будет находить баги вызванные подобными действиями и не понимать отчего же они, ведь он просто "присваивает значение public переменной другого класса).

тут важно усвоить что свойство для вызывающего кода выглядит как переменная, а переменной не свойственно вызывать какой то код!(во что свойство превращается в MSIL`е это уже отдельная тема). 
PM MAIL ICQ   Вверх
mastermedia
Дата 21.1.2012, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 31.10.2010

Репутация: нет
Всего: нет



Экскалупатор, за ввод данных в set акссоре отвечает не явный параметр value. Насколько я понял из выше написанного нельзя два раза вводить данные с помощью этого параметра. А для проверки корректных данных нужно использовать исключения. В ОПП требуется, чтобы все вводимые данные проверялись, а в рамках моего задания подразумевается, что я с исключениями не знаком. В таком случае я могу присвоить параметр value уже самой переменной и проверять данные этой переменной помощью булевского метода и бесконечного цикла для того, чтобы программа требовала от пользователя вводить данные, до тех пор, пока он не введет правильные данные. Вызывающий код не знает public переменная это или свойство, но мне же нужно каким- то образом проверять введенные данные. Конечно, переменной не присуща возможность вызывают какой-то код. Но в случае, если я не буду использовать свойства, то я должен использовать методы для возврата и ввода значения get и set. В этих методах я могу вызывать другой метод для проверки вводимых данных. Шилдт пишет, что свойства предоставляют более совершенный и рациональный путь для достижения того же самого. Плюс еще есть автоматические присваиваемые свойства, они используются, когда не требуется проверять вводимые данные. А обычные свойства требуется использовать, когда нужно проверять вводимые данные. 
PM MAIL   Вверх
Экскалупатор
Дата 21.1.2012, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



написать можно по разному, применение шарпа не избавляет от кривого кода. вызывать внутри свойства код который будет спрашивать что то у пользователя это пример кривого кода и ооооочень хреновой архитектуры, хотя конечно никто не мешает тебе так сделать...
PM MAIL ICQ   Вверх
mastermedia
Дата 21.1.2012, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 31.10.2010

Репутация: нет
Всего: нет



приведи, пожалуйста, как сделать качественный код в моем случае без использования исключений.
PM MAIL   Вверх
Экскалупатор
Дата 21.1.2012, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



ну если уж так не катит исключения то вынеси общение с пользователем в тот метод, который передает значение в свойство, т.е. сделай так что бы данные не знали откуда они взялись и что бы они не могли общаться с пользователем.
PM MAIL ICQ   Вверх
mastermedia
Дата 21.1.2012, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 31.10.2010

Репутация: нет
Всего: нет



Правильно я понял идею?
Код

 public string Model
        {
            get
            {
                return model;
            }

            set
            {
                model = value;
            }
        }

        public void inputModel()
        {
            Console.WriteLine("Введите номер:");
            
                {
                    Model = Console.ReadLine();
                }while(ModelIsNotCorrect(Model));
        }

PM MAIL   Вверх
Экскалупатор
Дата 22.1.2012, 01:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



если это все в одном классе то это неправильно, потому как получается дублирование и возможность задать переменную двумя разными способами. сделай класс, который будет создавать твои объекты. реализуй отдельно валидатор и прогоняй через него данные. но лучше исключения.
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.