何时调用父函数?

时间:2015-10-06 11:46:16

标签: ios swift oop

我什么时候应该调用函数的父版本?它应该是儿童功能中的第一件事还是最后一件事? (以及“父”和“子”,我的意思是继承层次结构,而不是视图层次结构。)

这个问题一般可以回答,但我个人在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()。

我应该更改我的代码(并复制该行代码)或我的方法是否正确?

3 个答案:

答案 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)
    }
}

至于视图控制器的委托方法调用,我们通常希望初始化父类中的所有内容,然后在子类中开始构建它。