【问题标题】:What's the correct way of thinking C# protected accessor in swift?快速思考 C# 保护访问器的正确方法是什么?
【发布时间】:2016-01-29 15:52:54
【问题描述】:

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

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

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

我看到的选项

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

基类的实现细节

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

【问题讨论】:

    标签: swift inheritance


    【解决方案1】:

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

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

    如果最终您需要类似protected 或friend 的东西,那么正确的解决方案是private。将你的子类或你的朋友与目标放在同一个文件中,并标记私有事物private。或者,将需要协同工作的东西放在一个框架中,并标记属性internal。 Swift Blog 很好地解释了为什么这是一个有意的选择。

    【讨论】:

    • 很好的答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 2014-05-16
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多