Вызов родительского метода в родительском методе - PullRequest
1 голос
/ 03 июня 2011

У меня есть 2 класса, давайте назовем их parentClass и childClass.parentClass имеет два метода, давайте вызовем их firstMethods и secondMethods.childClass наследует parentClass и реализует firstMethod.parentClass реализует оба метода.И вот моя проблема.В моем parentClass со стороны secondMethods я хочу вызвать firstMethods, но когда я делаю это с помощью [self firstMethods], я перехожу к реализации childClass.Если я вызываю его с помощью [super firstMethods], он вызывает метод в суперклассе (в данном примере это UIView).

Итак, возможно ли в цели c вызывать методы в стороне от базового класса?Один метод вызывает другой метод, не переходя в конкретную реализацию класса?

Ответы [ 2 ]

1 голос
/ 03 июня 2011

Вы не делаете.Измените свой дизайн.

Чтобы объяснить это, вот некоторый код.(В моем примере используется 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от его родителя с его собственной реализацией.Который подобран, даже если мы не используем этот метод напрямую.Это потрясающая особенность любого языка на основе классов.у класса 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 наследует и не переопределяет.

Весь смысл в том, что дочерний класс сохраняет контроль над тем, какой код запускается, а НЕ за родительским классом.Это важно.Ваше желаемое решение будет означать, что вы должны изменить базовый класс, если вы хотите изменить это поведение.Но простое предоставление наследования дает вам максимальную гибкость, позволяя дочерним классам точно определять, как они хотят использовать методы, предоставляемые их родителями.

0 голосов
/ 03 июня 2011

Если у вас есть объект childClass, то [self firsteMethod] вызовет реализацию childClass [super firsMethod] вызовет parentImplementation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...