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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Плохо ли использовать защищенные свойста? 
:(
    Опции темы
mastermedia
Дата 18.1.2012, 21:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я хочу сделать, чтобы свойство защищенно от внешнего вмешательства, но было доступно в пределах производных классов. Поэтому я со свойством использую модификатор доступа protected. А для установления и вывода значений данных буду выполнять с помощью открытых методов. Как мне дали понять, использование защищенных переменных плохая практика. Такой код будет лучше?
Код

private string model;

protected string Model
        {
            get
            {
                return model;
            }

            set
            {
                while(!IsModelCorrect(value))
                    model = value;
            }
        }
        public void inputModel()
        {
           Model = Console.ReadLine();
        }


  

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


Эксперт
***


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

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



а что мешает сделать свойство public? я как то не могу придумать case для подобного функционала.

Добавлено через 1 минуту и 25 секунд
получится что паблик доступ к свойству все равно есть(пусть и через еще один метод). но почему то производным классам нужно обращаться к свойству напрямую а остальным через метод, какой в этом смысл?

Добавлено через 1 минуту и 35 секунд
 smile  smile

Добавлено через 3 минуты и 25 секунд
Код

                while(!IsModelCorrect(value))
                    model = value;

это взорвало мой моск, как, каким образом, ты передаешь в свойство МНОГО value что бы обрабатывать их в цикле?
PM MAIL ICQ   Вверх
mastermedia
Дата 19.1.2012, 00:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Экскалупатор, 
Я не передаю много value. Метод IsModelCorrect требует от пользователя вводить данные до тех пор, пока он не ведет их правильно.
Код только начал писать, там много не дописанно. Выложу само задание, чтобы было понятнее.
Код

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

        private bool IsSpeedCorrect(double tempSpeed)
        {
            if (tempSpeed <= 0.0)
                return false;
            else
                return true;
        }

        private bool IsModelCorrect(string tempModel)
        {
            if (String.IsNullOrEmpty(tempModel))
                return false;
            else
                return true;
        }

        private bool IsNumberCorrect(string tempNumber)
        {
            if (string.IsNullOrEmpty(tempNumber))
                return false;
            else
                return true;
        }

        protected string Model
        {
            get
            {
                return model;
            }

            set
            {
                while(!IsModelCorrect(value))
                    model = value;
            }
        }
        public void inputModel()
        {
           Model = Console.ReadLine();
        }

        public void inputNumber()
        {
            
        }

        abstract public void DecsribeCarrier();
        abstract public double LiftingPower();
    }

Задание:
1)    Создать абстрактный класс Trans с методами  позволяющим вывести на экран информацию о транспортном средстве, а также определить грузоподъемность транспортного средства. 
2)    Создать производные классы: Легковая_машина (марка, номер, скорость, грузоподъемность), Мотоцикл (марка, номер, скорость, грузоподъемность, наличие коляски, при этом если коляска отсутствует, то грузоподъемность равна 0), Грузовик (марка, номер, скорость, грузоподъемность, наличие прицепа, при этом если есть прицеп, то грузоподъемность увеличивается в два раза) со своими методами вывода информации на экран, и определения грузоподъемности. 
3)    Создать базу (массив) из n машин, вывести полную информацию из базы на экран, а также организовать поиск машин, удовлетворяющих требованиям грузоподъемности. 


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


Эксперт
***


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

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



Код

abstract class Carrier
    {
        private string model;
        private string number;
        private double speed;
        private double liftPower;
        private bool IsSpeedCorrect(double tempSpeed)
        {
            return tempSpeed > 0.0;//зачем тут if если можно короче и проще?
        }
        private bool IsModelCorrect(string tempModel)
        {
            return !String.IsNullOrEmpty(tempModel);//зачем тут if если можно короче и проще?
        }
        private bool IsNumberCorrect(string tempNumber)
        {
           return !string.IsNullOrEmpty(tempNumber);//зачем тут if если можно короче и проще?
        }
        protected string Model
        {
            get
            {
                return model;
            }
            set
            {
                    model = value;//в свойстве не должно быть никаких повторных вводов, никогда, тут можно проверить валидно ли то значение 
                                  //которое было передано, и либо записать его либо сгенерировать исключение, но запускать тут повторно ввод НЕЛЬЗЯ
            }
        }
        public void inputModel()
        {
           string s;
           do
          {
             s = Console.ReadLine();
           }
           while(!IsModelCorrect(s));
           Model = s;
        }
        public void inputNumber()
        {
            
        }
        abstract public void DecsribeCarrier();
        abstract public double LiftingPower();
    }

я бы переписал это так, не претендую на гениальность, но тем не менее...
и все же я тут не увидел ситуации когда потребуется паблик метод и протектед свойство, я считаю что можно вполне ограничиться чем то одним, либо нужно придумать более реальный пример, но у меня придумать не получается. плохо это тем, что у тебя класс позволяет ДВУМЯ способами устанавливать значения, надо определиться, что бы интерфейс работы с классом не вызывал непонятностей, иначе сразу возникнет вопрос, если есть метод и свойство, которые меняют одно и тоже значение, то какой метод нужно использовать? и если их два то в чем их различия(в реализации)?

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


Шустрый
*


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

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



Экскалупатор, согласен. Думаю стоит свойством ограничиться.
PM MAIL   Вверх
Karadul
Дата 22.2.2012, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mastermedia, я в сисярпе сильно не шарю, но в яве принято вообще-то так, что setter кидает IllegalArgumentException, и никаких IsXXX. Кстати, а имена методов принято писать с большой буквы?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

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


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

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


 




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


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

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