代码之家  ›  专栏  ›  技术社区  ›  Virus721

C#单独的getter和setter声明

  •  0
  • Virus721  · 技术社区  · 7 年前

    如何分别声明属性的getter和setter?

    例如,假设我要创建以下层次结构:

    interface IReadOnlyFoo
    {
        string Value { get; }
    }
    
    interface IFoo : IReadOnlyFoo
    {
        string Value { set; }
    }
    
    class BasicFoo : IFoo
    {
        string Value { get; set; }
    }
    

    IFoo.Value 正在隐藏 IReadOnlyFoo.Value

    我看了一下.NET框架是如何声明 IReadOnlyList IList

    我怎么能做我想做的事?我可以用一个属性来做吗?或者我真的必须创建单独的 GetValue() SetValue()

    0 回复  |  直到 7 年前
        1
  •  3
  •   Volkmar Rigo    7 年前

    当您将接口定义更改为

    interface IReadOnlyFoo
    {
        string Value { get;  }
    }
    
    interface IReadWriteFoo
    {
        string Value { get; set; }
    }
    
    class BasicFoo : IFoo, IReadOnlyFoo
    {
        public string Value { get; set; }
    }
    

        2
  •  2
  •   KoroseMan    7 年前

    当实现接口时,这两个成员将被合并,因为IFoo.Value中没有get方法。

        interface IReadOnlyFoo
        {
            string Value { get; }
        }
    
        interface IFoo : IReadOnlyFoo
        {
            new string Value { set; }
        }
    
        class BasicFoo : IFoo
        {
           public string Value { get;  set; }
        }
    

    只要对接口使用隐式实现,它就可以按预期的方式运行。另一方面,如果希望对接口成员有两种不同的行为,则需要使用显式实现。你可以在这里找到一个例子
    https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/interfaces/how-to-explicitly-implement-members-of-two-interfaces

        3
  •  0
  •   Zohar Peled    7 年前

    Value 中的属性 IFoo 接口。

    从语义上讲, IReadOnlyFoo 价值 财产)。
    这是面向对象编程中继承的确切定义-子类型是其基类型的更具体版本,并且正在向其添加功能。

    interface IReadOnlyFoo
    {
        string Value { get;  }
    }
    
    interface IFoo : IReadOnlyFoo
    {
        new string Value { get; set; }
    }
    
    class BasicFoo : IFoo
    {
        public string Value { get; set; }
    }
    

    这样,如果您有类型的引用 BasicFoo ,和 价值 属性确实是只读的,但如果引用类型是 它是一个读/写属性。

    You can see a live demo on rextester.