Subclass/Extend UIView 所以所有其他视图(UIImageView、UITextField ...)在创建时继承
Subclass/Extend UIView so all other Views (UIImageView, UITextField ...) inherit upon creation
当我想向 UIView 添加功能以便我的应用程序中的所有视图都获得这些功能时,建议的方法是什么?事实上,我也需要添加一些存储的属性,因此无法进行扩展。由于我需要处理 Textfields、ImageViews、Views(谁知道还会有什么),我不想将每一个子类化,也不想添加该功能,所以目标是创建 UIView 和我所有控件的子类(如果可能的话)开箱即用该功能。
有了扩展会很容易,但是正如我所说,我也需要存储一些东西,那么这个目标可以通过子类实现吗?或者什么是正确的方法(也许还有第三种选择)
谢谢
为什么不定义一个协议并在协议扩展中提供默认实现,然后让 UIView 符合该协议?这是一个例子:
protocol MyProto {
var someVar: Bool { get set }
func someFunc() -> Void
}
extension MyProto {
var someVar: Bool {
get {
// provide default implementation
return true
}
set {
}
}
func someFunc() -> Void {
// provide common implementation
}
}
extension UIView: MyProto {}
您还可以使用 where
子句来限制类型的默认行为。
extension MyProto where Self: UIControl {
var someVar: Bool {
get {
return isUserInteractionEnabled
}
set {
isUserInteractionEnabled = newValue
}
}
}
extension MyProto where Self: UITextField {
var someVar: Bool {
get {
return isFirstResponder
}
set {
newValue ? becomeFirstResponder() : resignFirstResponder()
}
}
}
TLDR;你不能这样做,你将需要子class每个你想引入新属性的UI元素。
您不能这样做(无法访问源代码),因为您将通过在 UIView
和它的 class 之间注入您自己的 class 来有效地更改 class 继承树subclasses.
考虑一下如果一种语言允许这样的含义:
Class A
定义了一个属性,a
Class B
继承自Class A
,定义了一个属性b
,这很好,因为Class A
没有这个属性。
Class C
继承自 Class B
并具有 a
和 b
属性。
现在,如果您可以 'inject' Class A1
以某种方式 'below' Class A
会发生什么?
Class A1
可以定义一个属性、b
,这很好,因为Class A
没有这个属性
Class B
现在有问题了,因为 its b
与 superclass b
[=50 冲突=]
Class C
具有 属性 b
的多重继承菱形问题
当然,您只打算添加不冲突的属性(尽管您不知道这一点,因为您不知道所有可能的子class实现)并且不需要subclasses 访问你的 属性,所以多重继承
这不是问题,但如果这样的功能是在一种语言中,这些潜在的问题就需要解决,因为你不能指望每个人都有与你相同的意图。
当我想向 UIView 添加功能以便我的应用程序中的所有视图都获得这些功能时,建议的方法是什么?事实上,我也需要添加一些存储的属性,因此无法进行扩展。由于我需要处理 Textfields、ImageViews、Views(谁知道还会有什么),我不想将每一个子类化,也不想添加该功能,所以目标是创建 UIView 和我所有控件的子类(如果可能的话)开箱即用该功能。
有了扩展会很容易,但是正如我所说,我也需要存储一些东西,那么这个目标可以通过子类实现吗?或者什么是正确的方法(也许还有第三种选择)
谢谢
为什么不定义一个协议并在协议扩展中提供默认实现,然后让 UIView 符合该协议?这是一个例子:
protocol MyProto {
var someVar: Bool { get set }
func someFunc() -> Void
}
extension MyProto {
var someVar: Bool {
get {
// provide default implementation
return true
}
set {
}
}
func someFunc() -> Void {
// provide common implementation
}
}
extension UIView: MyProto {}
您还可以使用 where
子句来限制类型的默认行为。
extension MyProto where Self: UIControl {
var someVar: Bool {
get {
return isUserInteractionEnabled
}
set {
isUserInteractionEnabled = newValue
}
}
}
extension MyProto where Self: UITextField {
var someVar: Bool {
get {
return isFirstResponder
}
set {
newValue ? becomeFirstResponder() : resignFirstResponder()
}
}
}
TLDR;你不能这样做,你将需要子class每个你想引入新属性的UI元素。
您不能这样做(无法访问源代码),因为您将通过在 UIView
和它的 class 之间注入您自己的 class 来有效地更改 class 继承树subclasses.
考虑一下如果一种语言允许这样的含义:
Class A
定义了一个属性,a
Class B
继承自Class A
,定义了一个属性b
,这很好,因为Class A
没有这个属性。Class C
继承自Class B
并具有a
和b
属性。
现在,如果您可以 'inject' Class A1
以某种方式 'below' Class A
会发生什么?
Class A1
可以定义一个属性、b
,这很好,因为Class A
没有这个属性Class B
现在有问题了,因为 itsb
与 superclassb
[=50 冲突=]Class C
具有 属性b
的多重继承菱形问题
当然,您只打算添加不冲突的属性(尽管您不知道这一点,因为您不知道所有可能的子class实现)并且不需要subclasses 访问你的 属性,所以多重继承 这不是问题,但如果这样的功能是在一种语言中,这些潜在的问题就需要解决,因为你不能指望每个人都有与你相同的意图。