C# 只读接口属性';s可在实现内部读/写

C# 只读接口属性';s可在实现内部读/写,c#,interface,C#,Interface,我想喝杯咖啡 interface IFoo { string Foo { get; } } 其实现方式如下: abstract class Bar : IFoo { string IFoo.Foo { get; private set; } } 我希望属性可以通过接口获取,但只能在具体实现中写入。最干净的方法是什么?我是否需要“手动”实现getter和setter interface IFoo { string Foo { get; } } abstract cl

我想喝杯咖啡

interface IFoo
{
    string Foo { get; }
}
其实现方式如下:

abstract class Bar : IFoo
{
    string IFoo.Foo { get; private set; }
}
我希望属性可以通过接口获取,但只能在具体实现中写入。最干净的方法是什么?我是否需要“手动”实现getter和setter

interface IFoo
{
    string Foo { get; }
}


abstract class Bar : IFoo
{
    public string Foo { get; protected set; }
}
几乎与您拥有的一样,但受保护,并从类中的属性中删除
IFoo.

我建议
protected
假设您只希望从派生类内部访问它。相反,如果您希望它完全公开(也可以在类外设置),只需使用:

public string Foo { get; set; }

只需使用
protectedset
,并删除属性前面的
IFO
,使其隐式

interface IFoo
{
    string Foo { get; }
}
abstract class Bar : IFoo
{
    public string Foo { get; protected set; }
}

为什么要显式实现接口?这样编译和工作时不会出现问题:

interface IFoo { string Foo { get; } }
abstract class Bar : IFoo { public string Foo { get; protected set; } }

否则,您可以为该类拥有一个受保护/私有属性,并显式实现接口,但将getter委托给该类的getter。

或者使实现隐式而不是显式

abstract class Bar : IFoo
{
    public string Foo { get; protected set; }
}
或者添加一个支持字段

abstract class Bar : IFoo
{
    protected string _foo;
    string IFoo.Foo { get { return _foo; } }
}

protected
是一条路。你能澄清一下吗
string PartitionKey{get;protected set;}
生成一个错误“可访问性修饰符不能用于接口中的访问器”您需要使用backing字段实现属性,然后您可以从具体实现中访问该字段(当设置为protected时)。我不认为你可以通过自动属性来实现这一点。在具体的类中使用集合有什么问题?然后你可以读写它。在
类上使用
受保护的
,而不是在
接口上使用
。因为这是一个显式的实现,所以你不能添加setter。@juharr-Huh?伙计们,这不是真的!上面的代码不会产生任何错误:@Stewart\R这是因为您没有显式实现
IFoo.Foo
。Ahmad在我发表评论后改变了他的回答,这仍然是正确的。@juharr这个问题有点含糊不清,我认为OP意味着其他人注意到的受保护的属性,但它也可能意味着具体实现(而不是实现内部)的读/写属性啊,太好了,谢谢!我原以为
Bar
中的属性必须是
IFoo.Foo
,这给了我错误。但它给出了错误“访问器必须更严格…”@Stewart\u R DotNetFiddle用于显示工作代码示例。@Ahmad如果它在显式和受保护的
IFoo.Foo{get;protected set;}/code>编译器将给出两个错误,但既然有人抱怨你甚至不应该有一个setter,那么访问器的问题就没有什么意义了。@Stewart\R想学习第二个最有用的东西吗?在你的答案中加入类似于
[运行代码](https://dotnetfiddle.net/U0GGIK)
下面是您的代码示例。它在页面上创建了一个“按钮”,人们可以单击该按钮来运行您的示例。