我什么时候应该调用函数的父版本?它应该是儿童功能中的第一件事还是最后一件事? (以及“父”和“子”,我的意思是继承层次结构,而不是视图层次结构。)
这个问题一般可以回答,但我个人在iOS中实现视图控制器功能时遇到过这个问题。因此,iOS视图控制器编程的特定答案也与此相关。
例如:
class ChildViewController: ParentViewController {
override func viewDidLoad() {
// option 1 to do function's job
super.viewDidLoad()
// option 2 to do function's job
}
}
我一直认为选项1更好(没有理由,只是一种感觉!),但最近,我写了一些代码让我选择了选项2.
提前致谢。
修改
在我的例子中,两个子类继承自单个父类。两个孩子都有一个UIBarButton,在加载视图时应禁用它。我想将禁用代码放在父视图控制器中(因为它是self.navigationItem.rightBarButtonItem?.enabled = true
的确切代码行)但按钮是不同的,所以我必须在每个子视图控制器上创建按钮。这样,我必须在创建按钮后调用parent的viewDidLoad()。
我应该更改我的代码(并复制该行代码)或我的方法是否正确?
答案 0 :(得分:4)
就Private Sub Form_Load()
Dim nodX As Node
Dim MyDB As DAO.Database
Dim MyRS As DAO.Recordset
Dim MyRSChild As DAO.Recordset
Dim strSQL As String
Set MyDB = CurrentDb()
Set MyRS = MyDB.OpenRecordset("SELECT * FROM Prt_Group ORDER BY Group_Number", dbOpenDynaset)
Set nodX = Treeview1.Nodes.Add(, , , "Parts List Treeview")
'Populate grp Nodes
Do While Not MyRS.EOF
Set nodX = Treeview1.Nodes.Add(1, tvwChild, "Group" & MyRS![PartGroupID], MyRS![Group_Number] & " - " & MyRS![Group_Description])
nodX.EnsureVisible
MyRS.MoveNext
Loop
strSQL = "Select * From Prt_Category ORDER BY PartCat_Number"
Set MyRSChild = MyDB.OpenRecordset(strSQL, dbOpenSnapshot)
'Populate category Nodes
Do While Not MyRSChild.EOF
Set nodX = Treeview1.Nodes.Add("Group" & MyRSChild![PartGroupID], tvwChild, "A" & CStr(MyRSChild![PartCatID]), _
" " & MyRSChild![PartCat_Number] & " - " & _
MyRSChild![PartCat_Description])
MyRSChild.MoveNext
Loop
MyRSChild.Close
MyRS.Close
Set MyRSChild = Nothing
Set MyRS = Nothing
End Sub
和类似的方法而言,你应该在方法的最开始调用超级实现,因为你希望在自己的代码开始工作之前已经设置了所有内容
答案 1 :(得分:2)
这个问题一般可以回答。
不,这取决于用例。
有时您想在开始时调用原始实现,有时最后调用。在其他情况下,您必须在重写方法之前和之后执行某些操作。
在根本不调用被覆盖的实现方面也很常见。在以编程方式设置视图时,此案例的一个很好的示例是filtered_results
loadView
方法。
答案 2 :(得分:0)
Per Apple Documentation,调用super取决于在开始使用之前是否要设置父类属性:
首先使用它的示例:
class Bicycle: Vehicle {
override init() {
super.init()
numberOfWheels = 2
}
}
最终使用它的示例:
class RecipeIngredient: Food {
var quantity: Int
init(name: String, quantity: Int) {
self.quantity = quantity
super.init(name: name)
}
override convenience init(name: String) {
self.init(name: name, quantity: 1)
}
}
至于视图控制器的委托方法调用,我们通常希望初始化父类中的所有内容,然后在子类中开始构建它。