具有相同属性的不同getter和setter的接口

时间:2009-10-26 12:15:24

标签: c# properties interface

我为接口做了以下声明:

public interface IBasic
{
  int Data { get; }
}

public interface IChangeable : IBasic
{
  int Data { set; }
}

编译器说IChangeable.Data隐藏IBasic.Data。这很合理。我找到的替代方案是:

public interface IBasic
{
  int Data { get; }
}

public interface IChangeable : IBasic
{
  void ChangeData(int value);
}

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

3 个答案:

答案 0 :(得分: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;}  }
}

但是这很令人困惑,你需要使用显式实现等,如果你想使用隐藏版本,可能需要在调用者处投一些。如果你走这条路线,我建议在get上公开setIChangeable

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; } }
}

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

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; }
    }
}

如果你做(我更喜欢),这也会有效:

public interface IChangeable : IBasic
{
    new int Data { get; set; }
}

答案 1 :(得分:1)

也许我误解了你的问题,但你不会这样做

public interface IChangeable : IBasic
{
  int Data { get; set; }
}

即。让IChangeable覆盖属性,但保持“get”存在。

由于IChangeable继承自IBasic,我假设您希望IChangeable的实现具有“get”的实现。

答案 2 :(得分:1)

我认为GetData和SetData方法对于这种情况更清楚:

public interface IBasic
{  
    int GetData();
}

public interface IChangeable : IBasic
{  
    void SetData(int data)
}