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)
下面是您的代码示例。它在页面上创建了一个“按钮”,人们可以单击该按钮来运行您的示例。