首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >派生类可以隐藏访问器吗-下面的代码有什么问题

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

Stack Overflow用户
提问于 2014-02-22 14:16:35
回答 2查看 68关注 0票数 3

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

代码语言:javascript
运行
复制
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);
        }

我不应该期望输出结果是,

代码语言:javascript
运行
复制
Name of object one is Base Der One
Name of object one is Base On1
EN

回答 2

Stack Overflow用户

发布于 2014-02-22 14:25:17

  1. 这段代码:

公共新字符串名称{ set { Name = "Der“+ value;} get { return Name;}}

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

  • What,你可能想要它是多态的。您应该在派生类中设置属性virtualoverride

如果不使用虚拟特性,则以下对象的行为将不符合您的要求:

setter one = BaseCS DerivedCS();one.Name = "name";//基本实现是setter中的setter属性值,这通常不是一个好主意。用户期望遵守以下合同:

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

票数 2
EN

Stack Overflow用户

发布于 2014-02-22 14:37:24

下面是你应该做的事情

代码语言:javascript
运行
复制
    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; }
        }
    }

或使用新的关键字

代码语言:javascript
运行
复制
 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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21950562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档