我有一个抽象类家族,我想实现这些抽象类来根据创建的实例执行任务。但是,当我尝试使用声明为基类的变量调用该方法时,我得到“静态成员'...'不能用于类型'...'的实例”
一些代码看起来像这样
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似乎并不喜欢。
答案 0 :(得分:1)
在创建和使用类的实例时,必须将theTask
声明为 instance 方法并覆盖它(在任何情况下都必须这样做)
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()
答案 1 :(得分:0)