在swift中思考C#protected accessor的正确方法是什么?

时间:2015-10-29 13:18:54

标签: swift inheritance

在c#中,我们有protected访问器,允许类成员在继承的clases上可见,但其余部分则不可见。

在Swift中,这并不存在,所以我想知道对于这样的事情是什么样的正确方法:

  

我想要一个变量(内部行为)和一个在基类上使用这个变量的公共方法。此变量也将用于继承的clases。

我看到的选项

  • 忘记基类,并在我需要的地方实现变量和方法。 错误,重复的代码
  • 通过合成实现继承。我创建了一个包含常用方法的类,这将由组合而不是继承使用。 LESS WRONG 但仍然重复可以通过继承来避免的代码
  • 实现继承并在基类上创建变量internal。 错误,因为除了允许对继承的clases进行可见性之外,没有任何理由地公开事物。

基类的实施细节

我希望有一个NSOperationQueue实例和一个公共方法来取消排队操作。我从继承的类向此队列添加新操作。

1 个答案:

答案 0 :(得分:3)

在Swift中,正确的答案几乎总是协议和扩展。它几乎从不继承。有时Cocoa会阻碍我们,因为Cocoa中的类比协议更常见,但目标几乎总是协议和扩展。子类化是我们的最后选择。

您的特定情况令人困惑,因为NSOperationQueue已经有一个公共方法来取消排队操作(cancelAllOperations)。如果要保护队列免受外部访问(例如,阻止调用者直接使用addOperation),那么您应该将队列放在另一种类型(即组合)中,并将您想要的内容转发到队列。关于您正在解决的具体问题的更多细节将使我们能够帮助建议其他类似Swift的解决方案。

如果您最终需要看似protectedfriend的内容,则正确的解决方案是private。将您的子类或您的朋友放在与目标相同的文件中,并标记私有内容private。或者,将需要协同工作的东西放在框架中,并标记属性internalSwift Blog提供了一个很好的解释,说明为什么这是一个有意的选择。