在父方法中调用父方法

时间:2011-06-03 08:56:40

标签: objective-c inheritance

我有2个类,我们称之为parentClass和childClass。 parentClass有两个方法,让我们调用它们firstMethods和secondMethods。 childClass继承parentClass并实现firstMethod。 parentClass实现两种方法。这是我的问题。在secondMethods一侧的parentClass中,我想调用firstMethods但是当我使用[self firstMethods]时,我跳转到childClass的实现。如果我用[super firstMethods]调用它,它会在超类中调用方法(在这个例子中它是UIView)。

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

2 个答案:

答案 0 :(得分:1)

你不这样做。改变你的设计。

这里解释一下是一些代码。 (我的例子使用ruby,因为几乎所有程序员都很容易阅读,但这不是一个ObjC问题,它关于类和继承)。

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方法。即使我们不直接使用该方法,也会被选中。这是任何基于类的语言的 awesome 功能。 B级有自己的方式来做one,不管它是如何被要求做的,它都是按照自己的方式做到的。实际上,子类覆盖方法的整个想法是它想要以不同的方式或者通过它的父方式增加某种方式。

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

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继承并且不覆盖。

这里的重点是子类保留对运行代码的控制,而不是父类。这个很重要。如果要更改此行为,则所需的解决方案意味着您必须更改基类。但是简单地让继承变得非常棒可以让孩子们通过让子类确切地定义如何使用父母公开的方法来实现最大的灵活性。

答案 1 :(得分:0)

如果你有childClass的对象,那么[self firsteMethod]将调用childClass实现[super firsMethod]将调用parentImplementation。