Swift默认实现了一个超类方法

时间:2017-12-12 00:57:36

标签: ios swift

考虑一个基类A,它定义了一个函数f(),它应该在子类中重写以自定义行为:

class A {
    func f() -> String {
        return "A"
    }
}

class AA: A {}
class AAA: AA {}
class AAAA: A {}

现在我想在层次结构树中添加一些子类,其中A是根,所有这些子类从f()返回相同的内容:

class B: AA {
    override func f() -> String {
        return "X"
    }
}

class C: AAA {
    override func f() -> String {
        return "X"
    }
}

因为每次f() protocol P { func f() -> String } extension P { func f() -> String { return "X" } } 的相同实现我都讨厌复制粘贴,所以我想把它移到一个共同的地方。由于基类是不同的并且不受我的控制,我认为协议扩展可能有所帮助。我想做这样的事情:

P

然后只需将我的类与协议class B: AA, P {} class C: AAA, P {} 相符合,希望我将在每个类中获得默认实现:

let x: A = C() // the same with just "let x = C()"
print("result: \(x.f())") // prints "result: A"

然而,这不起作用:

override var shouldAutorotate: Bool { return false }

override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return .portrait }

override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { return .portrait }

不确定原因,可能是因为协议扩展的静态分派,或者因为协议带来了与基类相同的功能名称而后者“获胜”,所以不知道。有没有办法在Swift中实现类似的东西?

理由:我已经厌倦了复制相同的代码,只能将控制器纵向制作成每个设计有这种限制的控制器:

//assuming all images are same size, get the height of the first image
var imgheight = document.querySelector("div.thumbnails-div > a > img:first-of-type").parentNode.parentNode.getBoundingClientRect().height;

var videos = document.getElementsByTagName("video");

//since width is set to 100% and height auto you will get videos with same width as images with space on top/bottom
for (var i=0; i<videos.length; i++){
    videos[i].height = imgheight;
}

0 个答案:

没有答案