【发布时间】:2018-10-25 08:00:11
【问题描述】:
我知道inconsistent accessibility 的问题经常被问到,而我的问题不同,因为我需要它是私密的。
详细解释一下:我有一个static类Line,Line中有一个structLingSegment,用户可以在Line中定义自己的LineSegment ,我需要确保线段之间没有冲突。
架构如下:
public static class Line {
private struct LineSegment {
public LineSegment(int start, int end) {
Start = start;
End = end;
}
public readonly int Start;
public readonly int End;
}
// User created LineSegment
static public LineSegment Segment1() {
return new LineSegment(1, 2);
}
static public LineSegment Segment2() {
return new LineSegment(3, 6);
}
}
而当用户想要访问自己的线段时,只能访问如下:
int start = Line.Segment1.Start;
int end = Line.Segment1.End;
我将LineSegment设为private的原因是:我只想让用户通过Line中的静态函数来创建和访问LineSegment,例如Segment1,Segment2。这样我就可以通过反射添加一个单元测试来获取Line中的所有方法,并获取所有线段的开始和结束,然后我可以判断线段之间是否存在冲突。
如果LineSegment 是公开的,用户可以使用new Line.LineSegment(2, 5) 破解他们的代码,而我无法通过单元测试检测到它。我不希望他们在Line 之外创建LineSegment。
但在 C# 中不允许使用 LineSegment,因为 可访问性不一致。他们有什么解决方案可以满足我的要求吗?谢谢!
【问题讨论】:
-
其实不然,其他人的代码在这个方案下还是可以直接构造
LineSegment的。 -
但是
Segment1和Segment2也不能构造LineSegment? -
如果他们可以访问解决方案,他们可以简单地删除私有修饰符......我想:如果程序员做了愚蠢的事情,那么让他做愚蠢的事情......另一方面手 ... 为什么不让 LineSegment 构造函数采用 Line 参数,或者让工厂构建 LineSegments 并在运行时完成检查?
-
是的,有。但是编译器说构造函数由于其保护级别而无法访问。我认为是因为无法调用私有构造函数?
-
是的,你的评论很有道理。如果他们有权访问解决方案,他们可以简单地删除私有修饰符......但我认为不要给他们
LineSegment的访问权限会给他们使用Segment1之类的功能的提示......(如果他们构造了LineSegment,我什至找不到!
标签: c# visibility