在c#中,我们有protected
访问器,允许类成员在继承的clases上可见,但其余部分则不可见。
在Swift中,这并不存在,所以我想知道对于这样的事情是什么样的正确方法:
我想要一个变量(内部行为)和一个在基类上使用这个变量的公共方法。此变量也将用于继承的clases。
我看到的选项
基类的实施细节
我希望有一个NSOperationQueue
实例和一个公共方法来取消排队操作。我从继承的类向此队列添加新操作。
答案 0 :(得分:3)
在Swift中,正确的答案几乎总是协议和扩展。它几乎从不继承。有时Cocoa会阻碍我们,因为Cocoa中的类比协议更常见,但目标几乎总是协议和扩展。子类化是我们的最后选择。
您的特定情况令人困惑,因为NSOperationQueue
已经有一个公共方法来取消排队操作(cancelAllOperations
)。如果要保护队列免受外部访问(例如,阻止调用者直接使用addOperation
),那么您应该将队列放在另一种类型(即组合)中,并将您想要的内容转发到队列。关于您正在解决的具体问题的更多细节将使我们能够帮助建议其他类似Swift的解决方案。
如果您最终需要看似protected
或friend
的内容,则正确的解决方案是private
。将您的子类或您的朋友放在与目标相同的文件中,并标记私有内容private
。或者,将需要协同工作的东西放在框架中,并标记属性internal
。 Swift Blog提供了一个很好的解释,说明为什么这是一个有意的选择。