Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单独的getter和setter声明_C#_Interface_Getter Setter - Fatal编程技术网

C# 单独的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

如何分别声明属性的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方法吗?

当您将接口定义更改为

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默认情况下不显示警告,因此我错过了它。无论如何,这不是一个问题,因为隐藏是有意的,所以它只是添加新关键字的问题。