# 22.open与public

## 在对自己的项目进行组件化的时候遇到这样一个问题

### UI组件中

```swift
public class LedgerNavigationViewController: UINavigationController, StoryboardInitializable {
    public override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
}
```

### 项目中（报错）

* Cannot inherit from non-open class 'LedgerNavigationViewController' outside of its defining module
* Overriding non-open instance method outside of its defining module

```swift
class MapNavigationController: LedgerNavigationViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    weak var selector: LocationSelector?
}
```

## 修改

根据提示，将组件库中的 `public` 改成 `open` ，就可以了。

```swift
open class LedgerNavigationViewController: UINavigationController, StoryboardInitializable {
    open override func viewDidLoad() {
        super.viewDidLoad()

        setupUI()
    }
}
```

## 总结

平时每台用到 `open`，这里遇到问题才很清楚get到他俩的不同，主要区别在继承的控制上。

* public
  * 只能在模块内部被继承
* open
  * 可以再其他模块被继承
