对已实现的接口属性强制使用私有访问修饰符的解决方法
本文关键字:访问 方法 解决 接口 实现 属性 | 更新日期: 2023-09-27 18:28:38
我有如下接口:
public interface IData
{
String Name { get; set; }
}
以及实现它的两个类:
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; }
我确实理解为什么这不是明确可行的逻辑原因。属性将使用接口访问,该接口没有任何关于已实现的访问修饰符的线索,如果找不到,则会失败。
我的用例是,Data1
和Data2
实例都应该能够使用使用IData
参数的方法(有些方法不使用Name
),但Data2
是敏感的,不应该直接访问。因此,我正在寻找一个变通办法。
听起来您希望禁止通过Data2
实例访问Name
。如果是这种情况,那么使用显式接口实现
public class Data2 : IData {
String IData.Name {
get { ... }
set { ... }
}
}
现在,只有当Data2
实例被视为IData
时,才能访问Name
Data2 obj = new Data2();
string name = obj.Name; // Error!
IData other = obj;
name = other.Name; // Ok
编译器不允许实现此接口的类型更改此项,因为您要求它不要更改。您定义了一个具有公共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; }
}