我试图隐藏派生类中的访问器,这有效吗?我的系统在执行时没有响应。
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
-
此代码:
public new string Name { set { Name = "Der " + value; } get { return Name; } }
将导致堆栈溢出,因为getter和setter中的
Name
将在DerivedCS
中引用Name
,而不是在BaseCS
中。Name
属性将永远调用自己,直到崩溃。您需要使用base.Name
。 -
你可能想要的是多形瘤。您应该在派生类中设置属性
virtual
和override
setter。如果你不使用虚拟属性,以下对象将不会按照你想要的方式运行:
BaseCS one = new DerivedCS(); one.Name = "name"; // base implementation is called
-
更改setter中的属性值通常是个坏主意。用户期望遵守以下合同:
var a = new A(); a.Foo = "bar"; Debig.Assert(a.Foo == "bar");
以下是您应该做的
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; }
}
}
OR与新关键字
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();