Swift Вызов метода переопределения по подклассу из суперкласса - PullRequest
0 голосов
/ 08 марта 2020

У меня есть два класса по быстрому. У меня есть метод действия, который я хочу переопределить во многих подклассах, которые будут выполнять другое действие. Я хотел, чтобы эта функция была похожа на абстрактный класс в Java, где я мог бы передать кучу разных подклассов определенного класса, но на них можно было бы ссылаться из суперкласса, чтобы один из них мог быть вызван для всех них даже если это разные подклассы с разными переопределенными версиями этого одного метода. Вот что я имею в виду.

class1: SKSpriteNode{
    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)     
    }

    func action(){ print("this should never be called") }
}

class2: class1 {
    required init?(coder aDecoder: NSCoder) {

        super.init(coder: aDecoder)   
    }

    override func action() {
        self.physicsBody?.affectedByGravity = true
    }
}

Я бы хотел сделать что-то подобное. Узел с именем someName будет определен как class2 в редакторе SKScene.

class GameScene...

let node = self.childNode(withName: "someName") as? class1
noe.action()

Однако я никогда не получаю желаемый результат. Я всегда получаю вызов class1, даже когда хочу, чтобы он был переопределен как class2 и включил гравитацию для этого узла. Я хотел бы вызвать метод действия для многих подклассов class1 независимо от подкласса, поэтому просто изменение метода class1 для выполнения того, что я хочу, не будет работать.

Спасибо

РЕДАКТИРОВАТЬ: Вот мои фактические классы: Итак, у меня есть некоторые классы, которые являются узлами, которые будут запускаться, когда пользователь проходит узел триггера. У него есть сохраненное значение для имени целевого узла, которое затем извлекается из основного SKScene, его родителя. Затем я хочу иметь определенный c TargetNode, DropNode, который заставит его упасть с неба, но я хочу иметь возможность запускать любой подкласс TargetNode, вызывая метод TriggerAction, но кажется, что он никогда не выполняет код подкласс, DropNode, но вместо этого всегда ничего не делает / любой другой код, который я вставил в метод действия класса TargetNode. Это никогда не отменяет метод.

//SUPERCLASS:
import Foundation

class SKTargetNode: SKGlowNode {



    required init?(coder aDecoder: NSCoder) {

           super.init(coder: aDecoder)

    }

    func action(){
         print("i don't want this to be called")
    }

}

//SUBCLASS:
import Foundation

class SKDropNode: SKTargetNode {



    required init?(coder aDecoder: NSCoder) {

           super.init(coder: aDecoder)

    }


    override func action() {
        self.physicsBody?.affectedByGravity = true
    }
}

//Just a class that triggers any TargetNode
import Foundation
import SpriteKit

class SKTriggerNode: SKSpriteNode {



    required init?(coder aDecoder: NSCoder) {

           super.init(coder: aDecoder)

    }


    func triggerAction(_ scene: GameScene){
        let nodeName = self.userData?.value(forKey: "TargetNode") as? String ?? ""
        let node = scene.childNode(withName: "//\(nodeName)") as? SKTargetNode
        node?.action()

    }

}
...