我为接口做了以下声明:
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?或者这种方法还有其他选择吗?
答案 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
上公开set
和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; } }
}
重新评论;公开实现类型:
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)
}