我正在寻找一个干净的选项来实现类似于C ++ virtual classes
的功能简化用例: 我正在开发一种可以连接到多个后端“摄像机录制系统”的移动应用程序。我的应用程序将有多个“视图”,如“事件”,“蒙太奇”等。我不想使用后端特定代码丢弃每个视图。
为实现这一目标,我做了以下工作:
export class CameraServiceProvider {
getCameras(credentials?): Promise <Camera[]> {
throw constants.NOT_IMPLEMENTED;
}
// ... other methods
}
CameraService Provider
是基类。有adapters
扩展此类并提供其自己的供应商特定实现。例如:
export class ZmCameraServiceProvider extends CameraServiceProvider {
getCameras(credentials): Promise <Camera[]> {
// specific code for this camera provider backend
}
}
在我的app.component.ts
我这样做:
@Component({
templateUrl: 'app.html',
providers: [
{provide: CameraServiceProvider, useClass: ZmCameraServiceProvider},
]
})
此设置现在允许我在我的主应用中实例化并使用CameraServiceProvider
。将来,如果我需要更换到管理相机的其他系统,我需要做的就是开发一个新的whateverCameraServiceProvider
并修改我的useClass
- 其余的应用代码保持不变。
有一个问题:对于我添加到mynewFoo()
的每个新方法ZmCameraServiceProvider
,我必须在CameraServiceProvider
中声明该方法,否则编译器会抱怨mynewFoo()
没有不存在。
我想有一种方法可以想到,如果ZmCameraServiceProvider
中存在CameraServiceProvider
中不存在的方法,并且我在主应用程序中调用它,那么我正在打破自己的设计后端独立的目标 - 我想这是正确的。我仍然很好奇是否可以实现 - 也就是说,使用基类来调用派生类中的新方法
这就是为什么我在寻找类似于虚拟类的构造。