“静态成员'...'不能用于'...'类型的实例”

问题描述 投票:0回答:2

我有一系列抽象类,我想根据创建的实例来执行任务。但是当我尝试使用声明为基类的变量调用该方法时,我得到“静态成员'...'不能在类型'...'的实例上使用”

一些代码看起来像这样

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似乎不喜欢它。

ios iphone xcode oop swift4.2
2个回答
1
投票

在创建和使用类的实例时,您必须将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()

0
投票

您可以使用type(of:)来实现这一目标。

按照你的例子:

type(of: theObject).theTask()

© www.soinside.com 2019 - 2024. All rights reserved.