实现内部可读写的只读接口属性

3

I'd like to have an

interface IFoo
{
    string Foo { get; }
}

使用以下实现:

abstract class Bar : IFoo
{
    string IFoo.Foo { get; private set; }
}

我希望该属性可以通过接口进行获取,但只能在具体实现中进行写入。如何最简单地实现?我需要手动实现getter和setter吗?


3
protected是正确的选择。” - Jay
你能澄清一下吗?string PartitionKey { get; protected set; }会产生一个错误:“接口中不能使用访问修饰符来定义访问器”。 - bfops
3
你需要使用后备字段来实现此属性,然后你就可以从具体的实现中访问该字段(当设置为受保护时)。我认为自动属性无法实现这一点。 - MarcinJuraszek
在具体类中仅使用set方法有什么问题?然后您可以读取和写入它。 - Ahmad
在类上使用 protected 而不是在接口上使用。 - Jay
4个回答

4
interface IFoo
{
    string Foo { get; }
}


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

几乎和你想要的一样,但是在类的属性中删除IFoo.并使用protected。我建议使用protected,假设你只想从派生类内部访问它。如果你想要完全公开(也可以在类外设置),只需使用:
public string Foo { get; set; }

但它会出现错误:“访问器必须更加限制...” - Ahmad
1
@Stewart_R DotNetFiddle更适合展示工作代码示例,效果更佳 - Scott Chamberlain
1
@Ahmad 如果它是明确的并且受保护的 IFoo.Foo {get; protected set; },则编译器将会给出两个错误,但由于其中一个正在抱怨你甚至不应该有一个 setter,因此访问器问题有点无关紧要。 - juharr
1
@Stewart_R 想学习第二个最有用的东西吗?在你的答案中,可以在代码示例下面放置类似于 [<kbd>运行代码</kbd>](https://dotnetfiddle.net/U0GGIK) 的内容。这将在页面上创建一个“按钮”,供人们单击以运行您的示例。 - Scott Chamberlain
@Stewart_R 对,抱歉我没有注意到你在属性前面加了public。 - Ahmad
显示剩余2条评论

2
为什么要显式实现接口?以下代码可以编译并正常工作:
interface IFoo { string Foo { get; } }
abstract class Bar : IFoo { public string Foo { get; protected set; } }

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

2

可以将实现方式从显式变为隐式

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

或者添加一个后备字段

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

0

只需使用protected set,并在属性前删除IFO即可使其隐式。

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

因为这是一个显式实现,所以您无法添加setter。 - juharr
@juharr 什么?伙计们,那根本不是真的!上面的代码没有产生任何错误:http://i.imgur.com/sLcXpeh.png - Stewart_R
1
@Stewart_R 这是因为你没有显式实现 IFoo.Foo。Ahmad 在我发表评论后更改了他的答案,但我的评论仍然正确。 - juharr
@juharr 这个问题有点模糊,我认为 OP 的意思是受保护的属性,就像其他人注意到的那样,但它也可能意味着一个具体实现的可读/可写属性(而不是在实现内部)。 - Ahmad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接