属性重写在C#中不起作用?

属性重写在C#中不起作用?,c#,properties,polymorphism,overriding,C#,Properties,Polymorphism,Overriding,这里我写了特殊客户类,它是子类,我 有覆盖的属性Cname我想要特殊客户可以 仅当他们Cname=“Special”但当前不是时才更改名称 发生时,它将进入检查余额的基本Cname属性 (对于特殊客户类别,我不需要它) 请让我知道,如果我正在实现 运行时多态性通过此代码 class Customer { protected int _cid,_bal,_status; protected string _cnmae; public Cu

这里我写了
特殊客户类
,它是
子类
,我 有
覆盖的属性Cname
我想要特殊客户可以 仅当他们
Cname=“Special”
但当前不是时才更改名称 发生时,它将进入检查余额的
基本Cname属性
(对于
特殊客户类别
,我不需要它) 请让我知道,如果我正在实现
运行时多态性
通过此代码

  class Customer
    {
       protected int _cid,_bal,_status;
        protected string _cnmae;

        public Customer(int _cid,int _bal,int _status,string _cname)
        {
            this._cid = _cid;
            this._bal = _bal;
            this._cnmae = _cname;
            this._status = _status;
         }
        public int Cid
        { //read only property
          get
            {return _cid;}

           }
        public virtual string Cname
        {
            get
            {return _cnmae;}
            set
            {
                if (_status != 0 & _bal >= 500)
                {_cnmae = 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, _cnmae,_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 base.Cname}
          set
            {if (value == "SPECIAL")
                {
                    base.Cname = value;
                }
            }
        }

        public override void display()
        {
          Console.WriteLine("id={0} and name={1} and balance={2} and status={3}", _cid, _cnmae, _bal, _status);
        }
}
 class Program
    {        static void Main(string[] args)
        {
            Customer C1 = new Specialcustomer(10, 400, 1, "BOND");
            C1.display();
            C1.Cname = "SPECIAL";
            C1.display();
            Console.ReadKey();

        }
    }
您的代码已经在工作了-它正在调用
SpecialCustomer.Cname
setter,您可以通过在其中设置断点或添加一些日志来轻松判断。(我刚刚在setter中添加了一个
Console.WriteLine
语句。)

但是,由于
Customer.Cname
setter中的条件,它不会更改
Cname
的值:

set
{
    if (_status != 0 & _bal >= 500)
    {
        _cnmae = value;
    }
}
如果您更改代码,使客户的余额(比如)从400改为600,则
Cname
将更改为
SPECIAL

如果希望
SpecialCustomer
在提供的值为
SPECIAL
时无条件更改名称,则需要将该功能添加到基类中,例如

class Customer
{
    public virtual string Cname
    {
        get { return _cnmae; }
        set
        {
            if (_status != 0 & _bal >= 500)
            {
                SetCnameUnconditionally(value);
            }
        }
    }

    // This method allows subclasses to bypass the conditions
    // in the normal setter
    protected void SetCnameUnconditionally(string value)
    {
        _cnmae = value;
    }
}

class SpecialClass
{
    public override string Cname
    {
        get { return base.Cname; }
        set
        {
            if (value == "SPECIAL")
            {
                SetCnameUnconditionally(value);
            }
        }
    }
}

除此之外,现在是学习自动实现的属性的好时机——您可以在这里保存大量代码。我还建议,如果属性不能设置为值,通常最好抛出一个异常,而不是默默地忽略该值。(我还建议遵循.NET命名约定。)请停止投票!!如果你不想让人们投反对票,你应该改进你的问题:1)更好地格式化代码。现在到处都是。2) 把它简化为一个问题——目前有很多不相关的代码。3) 让你的问题更清楚,你期望发生什么和实际发生了什么。您的代码完全按照我的预期工作:如果您将值设置为“SPECIAL”,它将调用base setter;如果您将其设置为其他值,则不会。这正是您的覆盖setter要做的。看,是的。正如您所期望的,正在调用重写属性。然后调用基属性的唯一原因是重写属性正在调用它。我知道它正在工作,但我不打算使用我不想要的基属性。否则,如果它正在检查基属性条件而不是重写属性(它应该是),则重写没有用@DeepakJain:您的代码显式调用基本属性设置器。。。但前提是将值设置为“特殊”。您的代码将值设置为“SPECIAL”,因此它将调用base setter。它完全按照我的预期工作。如果您将余额设置为600,但将Cname设置为“非特殊”,则不会更改。您确实不清楚预期结果与实际结果之间的关系;to Cname=SpecialCustomer类中的值它引发堆栈溢出Exception@DeepakJain:是的,会的。我从来没有建议改成那样。@DeepakJain:否决票不是我的,但很可能是我的,因为你的问题不清楚。但要求人们取消否决票远不如改善问题有效。如果你问了不好的问题,你应该期待落选。