考虑一个基类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;
}