我有一系列抽象类,我想根据创建的实例来执行任务。但是当我尝试使用声明为基类的变量调用该方法时,我得到“静态成员'...'不能在类型'...'的实例上使用”
一些代码看起来像这样
class BaseClass{
class func theTask(){
print("do nothing")
}
}
class SubClassA: BaseClass{
class func theTask(){
print("do class A task")
}
}
class SubClassB: BaseClass{
class func theTask(){
print("do class B task")
}
}
该变量被声明为我的一个viewControllers的属性,
class SecondViewController: UIViewController {
var theObject: BaseClass = BaseClass()
override func viewDidLoad() {
super.viewDidLoad()
if(mysettings.selectedPort ==1){
theObject = SubClassA()
}else{
theObject = SubClassB()
}
configureUIElements()
}
@IBAction func scanButtonPressed(_ sender: Any) {
let devices = self.theObject.theTask()
}
}
这条线说
let devices = self.theObject.theTask()
是给我错误的那个静态成员'theTask'不能用在'BaseClass'类型的实例上
我来自C ++所以这种编码很常见,但Swift似乎不喜欢它。
在创建和使用类的实例时,您必须将theTask
声明为实例方法并覆盖它(在任何情况下您都必须这样做)
class BaseClass{
func theTask(){
print("do nothing")
}
}
class SubClassA: BaseClass{
override func theTask(){
print("do class A task")
}
}
class SubClassB: BaseClass{
override func theTask(){
print("do class B task")
}
}
或者反过来将类型放入变量并在类型上调用方法
class BaseClass{
class func theTask(){
print("do nothing")
}
}
class SubClassA: BaseClass{
override class func theTask(){
print("do class A task")
}
}
class SubClassB: BaseClass{
override class func theTask(){
print("do class B task")
}
}
...
var theObject: BaseClass.Type = BaseClass.self
...
if mysettings.selectedPort == 1 {
theObject = SubClassA.self
}else{
theObject = SubClassB.self
}
...
let devices = theObject.theTask()