属性重写在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:否决票不是我的,但很可能是我的,因为你的问题不清楚。但要求人们取消否决票远不如改善问题有效。如果你问了不好的问题,你应该期待落选。