1

我有和界面如下:

public interface IData
{
    String Name { get; set; }
}

以及实现它的 2 个类:

public class Data1 : IData
{
    public String Name { get; set; }
}

public class Data2 : IData
{
    public String Name { get; set; }
}

我需要防止获取Data2实例的名称。编译器不允许以下所有形式:

internal String Name { get; set; }
private String Name { get; set; }
public String Name { private get; set; }

我确实理解为什么这不是明确可行的逻辑原因。将使用对已实现的访问修饰符没有任何线索的接口访问属性,如果找不到它,则会失败。

我的用例是Data1Data2实例都应该能够使用使用IData参数的方法(一些不Name存在使用的方法),但是Data2是敏感的,不应该直接访问。因此,我正在寻找一种解决方法。

4

2 回答 2

5

听起来您希望Name通过实例的访问Data2被禁止。如果是这种情况,则使用显式接口实现

public class Data2 : IData {
  String IData.Name { 
    get { ... } 
    set { ... } 
  }
}

现在Name只有在Data2实例被视为IData

Data2 obj = new Data2();
string name = obj.Name; // Error!
IData other = obj;
name = other.Name;  // Ok
于 2013-08-22T22:07:42.507 回答
2

编译器不允许实现此接口的类型更改它,因为您要求它不要这样做。您定义了一个具有公共 getter 和 setter 的接口。

public interface IData
{
    String Name { get; set; }
}

听起来您需要两个接口:

public interface ISettableData
{
    String Name { set; }
}

public interface IData : ISettableData
{
    String Name { get; set; }
}

和实施:

public class Data1 : IData
{
    public String Name { get; set; }
}

public class Data2 : ISettableData
{
    public String Name { set; }
}
于 2013-08-22T22:15:23.433 回答