如何分别声明属性的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如何声明IReadOnlyList
和IList
接口,但是它是通过另一种方式完成的。
我该如何实现自己想做的事情?我可以使用属性来执行此操作,还是必须真的创建单独的GetValue()
和SetValue()
方法?
答案 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
这是一个读/写属性。