派生类可以隐藏访问者吗?下面的代码有什么问题



我试图隐藏派生类中的访问器,这有效吗?我的系统在执行时没有响应。

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
  1. 此代码:

    public new string Name
    {
    set { Name = "Der " + value; }
    get { return Name; }
    }
    

    将导致堆栈溢出,因为getter和setter中的Name将在DerivedCS中引用Name,而不是在BaseCS中。Name属性将永远调用自己,直到崩溃。您需要使用base.Name

  2. 你可能想要的是多形瘤。您应该在派生类中设置属性virtualoverridesetter。

    如果你不使用虚拟属性,以下对象将不会按照你想要的方式运行:

    BaseCS one = new DerivedCS();
    one.Name = "name"; // base implementation is called
    
  3. 更改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();

最新更新