如果不是用于类型推理,那么不仅可以实施不变的,可以“两全其美” FluentThing
在API中定义的类,但另一个可变的, FluentThingInternalUseOnly
支持扩大转换为 FluentThing
. 。流利的成员 FluentThing
将构建一个新实例 FluentThingInternalUseOnly
并将后一种类型作为其返回类型;成员 FluentThingInternalUseOnly
将继续操作并返回, this
.
如果有人说 FluentThing newThing = oldFluentThing.WithThis(4).WithThat(3).WithOther(57);
, , 这 WithThis
方法将构建一个新的 FluentThingInternalUseOnly
. 。同一实例将被修改并返回 WithThat
和 WithOther
;然后将其复制到新的数据 FluentThing
其参考将存储在 newThing
.
这种方法的主要问题是,如果有人说 dim newThing = oldFluentThing.WithThis(3);
, , 然后 newThing
不会提及不变的 FluentThing
, ,但可变 FluentThingInternalUseOnly
, ,而且那件事将无法知道对它的参考已被持续存在。
从概念上讲,需要的是一种 FluentThingInternalUseOnly
足够公开,可以将其用作公共功能的返回类型,但不能公开以允许宣布其类型变量的外部代码。不幸的是,我不知道有任何方法,尽管也许有一些技巧 Obsolete()
标签可能是可能的。
否则,如果所采用的对象很复杂,但是操作很简单,那么最好的操作是让流利的接口方法返回一个对象,该对象与该对象有关该对象,并与该对象以及有关什么信息以及有关什么应该对该对象进行[流利的方法将有效地构建一个链接的列表],并懒惰地评估对所有适当更改的对象的引用。如果有人打电话 newThing = myThing.WithBar(3).WithBoz(9).WithBam(42)
, ,将在每个步骤的每个步骤中创建一个新的包装器对象,也是第一次尝试使用 newThing
作为一个事情,必须构建一个 Thing
实例对其进行了三个更改,但原始 myThing
不会被触摸,只有一个新实例才有必要 Thing
而不是三个。