关于objective c:在父方法中调用父方法

Calling parent method within a parent method

我有两个班,我们称之为家长班和儿童班。ParentClass有两个方法,我们称它们为FirstMethods和SecondMethods。ChildClass继承ParentClass并实现FirstMethod。ParentClass实现这两个方法。这是我的问题。在我的parentclass中,在secondmethods旁边,我想调用firstmethods,但是当我使用[self firstmethods]时,我会跳到childclass的实现中。如果我用[super firstmethods]调用它,它会在一个超级类中调用方法(在本例中是uiview)。

那么,在目标C中,是否可以在基类的一侧调用方法?一个方法调用其他方法而不在具体的类实现中跳转?


你没有。改变你的设计。

为了解释这一点,这里有一些代码。(我的示例使用Ruby是因为它对于几乎任何程序员都很容易阅读,但这不是一个objc问题,而是关于类和继承的问题)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class A
  def one
   "one"
  end
  def two
    self.one +"-two"
  end
end

class B < A
  def one
   "B-"+ super
  end
end

a = A.new
puts a.one #=>"one"
puts a.two #=>"one-two"

b = B.new
puts b.one #=>"B-one"
puts b.two #=>"B-one-two"

因此,类B使用它自己的实现从其父级重写one方法。即使我们不直接使用这个方法,也会得到它。这是任何基于类的语言的一个很棒的特性。B类有它自己的方法来做一个one,无论它被要求如何做,它都是自己的方法。事实上,子类重写方法的整个思想是,它希望以与父类不同的或增强的方式执行某些操作。

为了解决这个问题,你需要完全避免这个问题。相反,将内部结构重构为您不重写的另一个方法。然后,您的基类和子类都可以为数据调用另一个方法。现在最酷的是,如果需要的话,您的孩子现在可以重写这个其他方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class A
  def one
    one_string
  end
  def two
    self.one_string +"-two"
  end
  def one_string
   "one"
  end
end

class B < A
  def one
   "B-"+ self.one_string
  end
end

a = A.new
puts a.one #=>"one"
puts a.two #=>"one-two"

b = B.new
puts b.one #=>"B-one"
puts b.two #=>"one-two"

在这个例子中,我们添加了一个类B继承并且不重写的第三个方法。

这里的重点是子类保留对运行代码的控制,而不是父类。这很重要。如果您想要改变这个行为,您想要的解决方案将意味着您必须改变基类。但是,仅仅让继承变得棒极了,就可以让子类精确地定义如何使用它们的父类公开的方法,从而使您获得最大的灵活性。


如果您有ChildClass对象,那么[Self FirsteMethod]将调用ChildClass实现[Super FirsMethod]将调用ParentImplementation。