我试图隐藏派生类中的访问器,它是否有效?我的系统在执行时没有响应。
class BaseCS
{
private string name;
public string Name
{
get { return name; }
set { name = "Base " + value; }
}
}
class DerivedCS : BaseCS
{
public new string Name
{
set { Name = "Der " + value; }
get { return Name; }
}
}
public static void Main()
{
BaseCS one = new DerivedCS();
one.Name = "One";
Console.WriteLine("Name of object one is {0} ", one.Name);
((BaseCS)one).Name = "On1";
Console.WriteLine("Name of object one is {0} ", one.Name);
}
我不应该期望输出结果是,
Name of object one is Base Der One
Name of object one is Base On1
发布于 2014-02-22 14:25:17
公共新字符串名称{ set { Name = "Der“+ value;} get { return Name;}}
将导致堆栈溢出,因为getters和setters中的Name
将在DerivedCS
中引用Name
,而不是在BaseCS
中。Name
属性将永远调用自己,直到崩溃。你需要使用base.Name
.
virtual
和override
。如果不使用虚拟特性,则以下对象的行为将不符合您的要求:
setter one = BaseCS DerivedCS();one.Name = "name";//基本实现是setter中的setter属性值,这通常不是一个好主意。用户期望遵守以下合同:
var a=新A();a.Foo = "bar";Debig.Assert(a.Foo == "bar");
发布于 2014-02-22 14:37:24
下面是你应该做的事情
class BaseCS
{
private string name;
public virtual string Name
{
get { return name; }
set { name = "Base " + value; }
}
}
class DerivedCS : BaseCS
{
public override string Name
{
set { base.Name = "Der " + value; }
get { return base.Name; }
}
}
或使用新的关键字
class BaseCS
{
private string name;
public string Name
{
get { return name; }
set { name = "Base " + value; }
}
}
class DerivedCS : BaseCS
{
public new string Name
{
set { base.Name = "Der " + value; }
get { return base.Name; }
}
}
now you should create the object as the derived type to get your expected result
DerivedCS one = new DerivedCS();
https://stackoverflow.com/questions/21950562
复制相似问题