Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Плохо ли использовать защищенные свойста?


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

private string model;

protected string Model
        {
            get
            {
                return model;
            }

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


  

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

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

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

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

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

это взорвало мой моск, как, каким образом, ты передаешь в свойство МНОГО value что бы обрабатывать их в цикле?

Автор: mastermedia 19.1.2012, 00:08
Экскалупатор, 
Я не передаю много 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 машин, вывести полную информацию из базы на экран, а также организовать поиск машин, удовлетворяющих требованиям грузоподъемности. 

Автор: Экскалупатор 19.1.2012, 00:25
Код

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. да и по правде сказать не должен класс машины узнавать какая у него скорость, ему это значение нужно передать откуда то из вне, при создании класса, ну и при работе с ним в дальнейшем...

Автор: mastermedia 19.1.2012, 14:34
Экскалупатор, согласен. Думаю стоит свойством ограничиться.

Автор: Karadul 22.2.2012, 17:55
mastermedia, я в сисярпе сильно не шарю, но в яве принято вообще-то так, что setter кидает IllegalArgumentException, и никаких IsXXX. Кстати, а имена методов принято писать с большой буквы?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)