如何保护相同的继承层次结构,例如 MVVM

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()工作的首选解决方案是什么?

PGD*_*Dev 8

Generics为此尝试使用。

创建initBaseViewController接受通用的参数 T限制为输入BaseViewModel,即

class BaseViewController<T: BaseViewModel> {
    let viewModel: T

    init(with viewModel: T) {
        self.viewModel = viewModel
    }
}
Run Code Online (Sandbox Code Playgroud)

现在继承ConcreteViewController1ConcreteViewController2BaseViewController给出泛型参数 的特定类型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)