stk*_*stk 3 inheritance hierarchy ios swift
我有一个基本的 ViewController 和一个基本的 ViewModel。基础 ViewModel 由基础 ViewController 使用。另外,我有 2 个 ViewControllers 子类和 2 个 ViewModels 子类需要一起使用。
例子:
class BaseViewModel {
func somethingBasic() {}
}
class ConcreteViewModel1: BaseViewModel {
func somethingConcrete1() {}
}
class ConcreteViewModel2: BaseViewModel {
func somethingConcrete2() {}
}
class BaseViewController {
let viewModel: BaseViewModel
init(with viewModel: BaseViewModel) {
self.viewModel = viewModel
}
}
class ConcreteViewController1: BaseViewController {
init(with viewModel: ConcreteViewModel1) {
super.init(with: viewModel)
}
func useViewModel() {
viewModel.somethingBasic()
viewModel.somethingConcrete1() //this does not work
}
}
class ConcreteViewController2: BaseViewController {
init(with viewModel: ConcreteViewModel2) {
super.init(with: viewModel)
}
func useViewModel() {
viewModel.somethingBasic()
viewModel.somethingConcrete2() //this does not work
}
}
Run Code Online (Sandbox Code Playgroud)
问题是:制作viewmodel.somethingConcrete1()和viewmodel.somethingConcrete2()工作的首选解决方案是什么?
Generics为此尝试使用。
创建init在BaseViewController接受通用的参数 T限制为输入BaseViewModel,即
class BaseViewController<T: BaseViewModel> {
let viewModel: T
init(with viewModel: T) {
self.viewModel = viewModel
}
}
Run Code Online (Sandbox Code Playgroud)
现在继承ConcreteViewController1和ConcreteViewController2从BaseViewController给出泛型参数 的特定类型T,即
class ConcreteViewController1: BaseViewController<ConcreteViewModel1> {
func useViewModel() {
viewModel.somethingBasic()
viewModel.somethingConcrete1()
}
}
class ConcreteViewController2: BaseViewController<ConcreteViewModel2> {
func useViewModel() {
viewModel.somethingBasic()
viewModel.somethingConcrete2()
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |