【发布时间】:2010-05-12 08:07:32
【问题描述】:
背景:我已将(父)类 E 与嵌套类 N 与 E 中的 N 的几个实例封闭在一起。在封闭的(父)类中,我正在做一些计算,并为嵌套类的每个实例设置值。像这样的:
n1.field1 = ...;
n1.field2 = ...;
n1.field3 = ...;
n2.field1 = ...;
...
这是一个大的 eval 方法(在父类中)。我的意图是——因为所有计算都在父类中(它们不能在每个嵌套实例中完成,因为它会使代码更复杂)——使 setter 只对父类和 getter 可用。
现在有一个问题:
- 当我将设置器设为私有时,父类无法访问它们
- 当我将它们公开时,每个人都可以更改值
- 而C#没有朋友的概念
- 我无法在构造函数中传递值,因为使用了惰性求值机制(因此必须在引用它们时创建实例 -- 我创建所有对象并按需触发计算)
我被卡住了——怎么做(限制访问父类,不多也不少)?
我怀疑我会先得到答案——“但为什么你不按每个字段拆分评估”——所以我举例回答这个问题:你如何计算最小值和最大值收藏?以快速的方式?答案是——一口气。这就是为什么我有一个 eval 函数,它可以一次进行计算并设置所有字段。
【问题讨论】:
-
内部关键字不够吗?
-
“信任”应该在编码范围之外。代码要么坚如磐石,要么不是,你必须对它给予额外的信任。我更喜欢第一个:-)
-
Eric Lippert 的评论令人惊讶和震惊,并说明了为什么 C# 的访问规则如此草率。访问与信任/安全无关......这完全是一个封装问题。嵌套类的成员应该总是可以被包含它们的类访问。他们不在 C# 中是糟糕的语言设计。具有讽刺意味的是,该语言强制内部类对外部类缺乏“信任”。
-
我也对 Eric Lippert 的评论感到震惊。我什至不相信自己,更不用说我的同事了!我使用可访问性级别来保证对象可能处于的状态。如果您依赖信任,为什么还要设置可访问性级别?
标签: c# design-patterns