单独的getter和setter声明

时间:2019-03-24 14:34:21

标签: c# interface getter-setter

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

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

interface IReadOnlyFoo
{
    string Value { get; }
}

interface IFoo : IReadOnlyFoo
{
    string Value { set; }
}

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

编译器正在抱怨,因为IFoo.Value隐藏了IReadOnlyFoo.Value,这不是我想要的。我想“合并” getter和setter声明。

我已经看过.NET Framwork如何声明IReadOnlyListIList接口,但是它是通过另一种方式完成的。

我该如何实现自己想做的事情?我可以使用属性来执行此操作,还是必须真的创建单独的GetValue()SetValue()方法?

3 个答案:

答案 0 :(得分:3)

将接口定义更改为

interface IReadOnlyFoo
{
    string Value { get;  }
}

interface IReadWriteFoo
{
    string Value { get; set; }
}

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

它应该工作。

答案 1 :(得分:2)

实现接口时,由于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

答案 2 :(得分:0)

您需要在代码中进行的所有更改就是在Value界面的IFoo属性中添加吸气剂。

从表面上说,IFoo是一种特殊的IReadOnlyFoo,它为其基本类型(Value属性的Setter)添加了另一种功能。
这是面向对象编程中继承的确切定义-子类型是其基本类型的一个更特定的版本,并为其添加了功能。

interface IReadOnlyFoo
{
    string Value { get;  }
}

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

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

此代码是完全有效的,它将为您提供所需的确切信息。

这样,如果您对IReadOnlyFoo的实例有类型BasicFoo的引用,则Value属性的确是只读的,但是如果您的引用类型是IFoo这是一个读/写属性。

You can see a live demo on rextester.