Akhil Jain Ответов: 1

Как получить доступ к закрытому полю в дочернем классе ?


class Customer
    {
        protected int _cid, _bal, _status;
        private string _cname;
 

        public Customer(int _cid, int _bal, int _status, string _cname)
        {
            this._cid = _cid;
            this._bal = _bal;
            this._cname = _cname;
            this._status = _status;
        }
 
        public int Cid
        { //read only property
            get
            {
                return _cid;
            }
 
        }
        public virtual string Cname
        {
            get
            {
                return _cname;
            }
            set
            {
                if (_status != 0 & _bal >= 500)
                {
                    _cname = value;
                }
            }
        }
        public int Bal
        {
            get
            {
                return _bal;
            }
            set
            {
                if (_status != 0 & value >= 500)
                {
                    _bal = value;
                }
            }
        }
        public int Status
        {
            get
            {
                return _status;
            }
            set
            {
 
                _status = value;
            }
        }
        public virtual void display()
        {
            // Console.WriteLine("id={0} and name={1} and balance={2} and status={3}",Cid,Cname,Bal,Status);
            Console.WriteLine("id={0} and name={1} and balance={2} and status={3}", _cid, _cname, _bal, _status);
        }
    }
 class Specialcustomer : Customer
    {
        public Specialcustomer(int _cid, int _bal, int _status, string _cname)
            : base(_cid, _bal, _status, _cname)
        { 
          }
        public override string Cname
        {
            get
            {
                return _cname;
 
            }
 
            set
            {
                if (value == "Special")
                {
                    _cname = value;
                }
            }
        }
 
        public override void display()
        {
            
Console.WriteLine("id={0} and name={1} and balance={2} and status={3}", Cid, Cname, Bal, Status);
        }
    }
static void Main(string[] args)
        {
            Customer C1 = new Specialcustomer(10, 400, 1, "BOND");
            C1.display();
            C1.Cname = "Special";
            C1.display();
            Console.ReadKey();
        }


Что я уже пробовал:

в этом примере
когда я использовал
_cname
как защищенное поле оно работало нормально но когда я изменил его на частное оно дает мне error.so как я могу получить доступ к
_cname
в дочернем классе, если я изменил поле на pvt. без использования Отражение.

и если бы я изменил _cname на base.Cname в специальном классе Customer переопределение не происходит так как это происходит с базовым свойством

Tomas Takac

Вы можете либо сделать его защищенным, либо установить поле с помощью свойства базового класса (base.Запись CNAME).

Akhil Jain

я не могу сделать его базовым.Функция переопределения Cname не будет работать, так как она перейдет в базовое свойство Cname.

1 Ответов

Рейтинг:
0

CPallini

Цитата:
как защищенное поле оно работало нормально но когда я изменил его на частное оно дает мне ошибку
В этом и заключается сама цель protected описатель. Смотрите, например наследование-наследуются ли частные члены В C#? - переполнение стека[^].