具有相同特性的不同吸气剂和设定器的接口

Fer*_*anB 7 c# properties interface

我为接口做了以下声明:

public interface IBasic
{
  int Data { get; }
}

public interface IChangeable : IBasic
{
  int Data { set; }
}
Run Code Online (Sandbox Code Playgroud)

编译器说IChangeable.Data隐藏了IBasic.Data.这很合理.我发现的替代方案是:

public interface IBasic
{
  int Data { get; }
}

public interface IChangeable : IBasic
{
  void ChangeData(int value);
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以在接口的不同层次结构上为同一属性定义setter和getter?或者这种方法还有其他选择吗?

Mar*_*ell 4

您可以重新声明它(或者更确切地说,告诉编译器您打算隐藏它):

public interface IChangeable : IBasic
{
  new int Data { set; }
}
class Foo : IChangeable
{
    private int value;
    int IBasic.Data { get { return value; } }
    int IChangeable.Data { set {this.value = value;}  }
}
Run Code Online (Sandbox Code Playgroud)

但这很令人困惑,您需要使用显式实现等,如果您想使用隐藏版本,可能还需要在调用者处进行一些转换。如果您选择这条路线,我建议同时公开getseton IChangeable

public interface IChangeable : IBasic
{
    new int Data { get;  set; }
}
class Foo : IChangeable
{
    private int value;
    int IBasic.Data { get { return value; } }
    int IChangeable.Data { set { this.value = value; } get {return value; } }
}
Run Code Online (Sandbox Code Playgroud)

重新评论;公开实现类型:

public interface IChangeable : IBasic
{
    new int Data { set; }
}
public interface IBasic
{
    int Data { get; }
}
class Foo : IChangeable
{
    private int data;
    public int Data {
        get { return data; }
        set { data = value; }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果你做到了(我更喜欢),这也会起作用:

public interface IChangeable : IBasic
{
    new int Data { get; set; }
}
Run Code Online (Sandbox Code Playgroud)