gpt4 book ai didi

c# - 派生类可以隐藏访问器-下面的代码有什么问题

转载 作者:行者123 更新时间:2023-11-30 17:00:37 27 4
gpt4 key购买 nike

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

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; }
    }

    会导致堆栈溢出,因为getters和setters中的Name会引用DerivedCS中的Name,而不是BaseCS<中的Name/Name 属性将永远调用自身,直到崩溃。您需要使用 base.Name

  2. 您可能需要的是多态性。您应该在派生类中将属性设置为 virtualoverride setter。

    如果您不使用虚拟属性,以下对象将不会按您希望的方式运行:

    BaseCS one = new DerivedCS();
    one.Name = "name"; // base implementation is called
  3. 在 setter 中更改属性值通常不是一个好主意。用户希望遵守以下契约(Contract):

    var a = new A();
    a.Foo = "bar";
    Debig.Assert(a.Foo == "bar");

关于c# - 派生类可以隐藏访问器-下面的代码有什么问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21950562/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com