Llamar al método principal dentro de un método principal

Tengo 2 clases, llamémoslas parentClass y childClass. parentClass tiene dos métodos, llamémoslos firstMethods y secondMethods. childClass hereda parentClass e implementa firstMethod. parentClass implementa ambos métodos. Y aqui esta mi problema. En mi parentClass en el lado de secondMethods quiero llamar a firstMethods pero cuando lo hago con [self firstMethods] salto a la implementación de childClass. Si lo llamo con [super firstMethods], llama al método en una superclase (en este ejemplo es UIView).

Entonces, ¿es posible en el objetivo c llamar a métodos en el lado de una clase base? ¿Un método llama a otro método sin saltar a una implementación de clase concreta?

preguntado el 03 de junio de 11 a las 05:06

2 Respuestas

Usted no. Cambia tu diseño.

Para explicar esto, aquí hay un código. (Mi ejemplo usa ruby ​​porque es fácil de leer para casi cualquier programador, pero esta no es una pregunta de ObjC, se trata de clases y herencia).

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"

Así que clase B anula el one método de su padre con su propia implementación. Lo cual se recoge incluso si no usamos directamente ese método. Esto es un impresionante característica de cualquier idioma basado en clases. la clase B tiene su propia forma de hacer one y no importa cómo se le pida que lo haga, lo hace a su manera. De hecho, la idea de que la clase secundaria anule un método es que quiere hacer algo de una manera diferente o aumentada de su padre.

Para evitar esto, debe evitar el problema por completo. En su lugar, refactorice los componentes internos a otro método que no anule. Entonces, su clase base y su clase secundaria pueden llamar a ese otro método para obtener datos. Lo bueno ahora es que su hijo ahora puede anular este otro método si también lo necesita.

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"

En este ejemplo, agregamos un tercer método que clase B hereda y no anula.

El punto aquí es que la clase secundaria retiene el control sobre qué código se ejecuta, NO la clase principal. Esto es importante. Su solución deseada significaría que tendría que cambiar la clase base si quisiera cambiar este comportamiento. Pero simplemente dejar que la herencia sea asombrosa le permite la mayor flexibilidad al permitir que las clases secundarias definan exactamente cómo quieren usar los métodos expuestos por sus padres.

Respondido el 03 de junio de 11 a las 17:06

tnx ... reorganicé mi código, así que ahora todo funciona perfectamente ... pero todavía me pregunto si es posible llamar a un método base desde un método base ... creo que no ... en C # puedes hacer eso, y soy nuevo en ObjC, así que todavía estoy explorando cosas :) - paz

Incluso si pudieras, diría que es un mal diseño. - alex wayne

cierto dat :) Estaba buscando una solución inteligente, pero todo lo que hice fue estropear mi diseño ... lo refactoricé y ahora todo está bien ... por ahora :) - paz

Si tiene un objeto de childClass, entonces [self firsteMethod] llamará a la implementación de childClass [super firsMethod] llamará a parentImplementation.

Respondido el 03 de junio de 11 a las 10:06

Absolutamente, pero eso no es una pregunta ... la pregunta es ¿cómo llamo a métodos en el lado de un parentCLass? En parentClass de secondMethod llamando a firstMethod sin entrar en childClass - paz

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.