C# 单独的getter和setter声明
如何分别声明属性的getter和setter 例如,假设我要创建以下层次结构:C# 单独的getter和setter声明,c#,interface,getter-setter,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.V
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方法吗?当您将接口定义更改为
interface IReadOnlyFoo
{
string Value { get; }
}
interface IReadWriteFoo
{
string Value { get; set; }
}
class BasicFoo : IFoo, IReadOnlyFoo
{
public string Value { get; set; }
}
它应该会起作用 将接口定义更改为
interface IReadOnlyFoo
{
string Value { get; }
}
interface IReadWriteFoo
{
string Value { get; set; }
}
class BasicFoo : IFoo, IReadOnlyFoo
{
public string Value { get; set; }
}
它应该会起作用 实现接口时,两个成员将合并,因为IFoo.Value中没有get方法 接口IReadOnlyFoo { 字符串值{get;} } 接口IFoo:IReadOnlyFoo { 新字符串值{set;} } 类BasicFoo:IFoo { 公共字符串值{get;set;} } 只要您对接口使用隐式实现,它就会按照您的预期运行。另一方面,如果希望接口成员具有两种不同的行为,则需要使用显式实现。你可以在这里找到一个例子
实现接口时,两个成员将合并,因为IFoo.Value中没有get方法 接口IReadOnlyFoo { 字符串值{get;} } 接口IFoo:IReadOnlyFoo { 新字符串值{set;} } 类BasicFoo:IFoo { 公共字符串值{get;set;} } 只要您对接口使用隐式实现,它就会按照您的预期运行。另一方面,如果希望接口成员具有两种不同的行为,则需要使用显式实现。你可以在这里找到一个例子
代码中需要更改的全部内容是在IFoo接口的Value属性中添加一个getter 从语义上讲,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; }
}
这段代码是完全有效的,它将为您提供所需的信息
这样,如果对BasicFoo实例的引用类型为IReadOnlyFoo,则Value属性实际上是只读的,但如果引用类型为IFoo,则它是读/写属性
代码中需要更改的全部内容是向IFoo接口中的Value属性添加一个getter 从语义上讲,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; }
}
这段代码是完全有效的,它将为您提供所需的信息
这样,如果对BasicFoo实例的引用类型为IReadOnlyFoo,则Value属性实际上是只读的,但如果引用类型为IFoo,则它是读/写属性
谢谢你的回答。这与我想要的非常接近,但在这种情况下有一个小问题:IReadOnlyFoo接口中存在的所有只读属性和方法,如Contains、Count或其他,都必须在IReadWritefo接口中复制,这可能会导致大量冗余。在这种情况下,我更倾向于使用Get和Set方法而不是属性。尽管不那么优雅,但它可能更干净。您可以通过引入第三个接口来克服此问题,该接口包含所有共享定义,并将此接口用作IReadOnlyFoo和iReadWriteFoo的基础。是的。我试试这个。非常感谢。请随意使用该建议编辑您的答案。更简单的解决方案是让IReadWriteFoo继承自IReadOnlyFoo。经过一些思考,我将坚持使用单独的Get和Set方法,因为它感觉比拥有一个只写的接口更自然,因为它本身并没有真正的理由存在,只是为了绕过C属性的限制。谢谢你的回答。这与我想要的非常接近,但在这种情况下有一个小问题:IReadOnlyFoo接口中存在的所有只读属性和方法,如Contains、Count或其他,都必须在IReadWritefo接口中复制,这可能会导致大量冗余。在这种情况下,我更倾向于使用Get和Set方法而不是属性。它可能会更干净,尽管它是不干净的
您可以通过引入第三个接口来克服这个问题,该接口包含所有共享定义,并将此接口用作IReadOnlyFoo和iReadWriteFoo的基础。是的。我试试这个。非常感谢。请随意使用该建议编辑您的答案。更简单的解决方案是让IReadWriteFoo继承自IReadOnlyFoo。经过一些思考,我将坚持使用单独的Get和Set方法,因为它感觉比拥有一个只写的接口更自然,因为它本身并没有真正的理由存在,只是为了绕过C属性的限制。谢谢你的回答。不幸的是,我必须添加新的关键字,就像您所做的那样,编译器不会告诉我IFoo.Value隐藏了IReadOnlyFoo.Value。我真的不确定这样做会涉及到什么。它会创建两个需要消除歧义的独立属性吗?我不知道,但我能感觉到以后会出现问题。这些接口定义了一组相关功能。因此,只要您对接口使用隐式实现,它就会按照您的预期运行。另一方面,如果希望接口成员具有两种不同的行为,则需要使用显式实现。如果我没有正确理解这个问题,您可以在这里找到一个示例,IFoo.Value应该提供getter和setter。所以你应该考虑添加get;谢谢你的回答。不幸的是,我必须添加新的关键字,就像您所做的那样,编译器不会告诉我IFoo.Value隐藏了IReadOnlyFoo.Value。我真的不确定这样做会涉及到什么。它会创建两个需要消除歧义的独立属性吗?我不知道,但我能感觉到以后会出现问题。这些接口定义了一组相关功能。因此,只要您对接口使用隐式实现,它就会按照您的预期运行。另一方面,如果希望接口成员具有两种不同的行为,则需要使用显式实现。如果我没有正确理解这个问题,您可以在这里找到一个示例,IFoo.Value应该提供getter和setter。所以你应该考虑添加get;此实现向您发出警告:“Rextester.IFoo.Value”隐藏继承的成员“Rextester.IReadOnlyFoo.Value”。如果要隐藏,请使用新关键字。是的,您是正确的。Rextester默认情况下不显示警告,因此我错过了它。无论如何,这不是问题,因为隐藏是有意的,所以只需添加新关键字即可。此实现会向您发出警告:“Rextester.IFoo.Value”隐藏继承的成员“Rextester.IReadOnlyFoo.Value”。如果要隐藏,请使用新关键字。是的,您是正确的。Rextester默认情况下不显示警告,因此我错过了它。无论如何,这不是一个问题,因为隐藏是有意的,所以它只是添加新关键字的问题。