2012-08-24 148 views
0

一些代码从孩子

class Parent 

    def print 
    p "Hi I'm the parent" 
    end 
end 

class Child < Parent 

    def initialize(num) 
    @num = num 
    end 

    def print 
    child_print 
    end 

    def child_print 
    if @num == 1 
     #call parent.print 
    else 
     p "I'm the child" 
    end 
    end 
end 

c1 = Child.new(1) 
c2 = Child.new(2) 
c1.print 
c2.print 

Child调用父母的方法是Parent一个实例。 Print是接口中暴露的方法,并且这两个类都定义了它们。 Child决定在一个(可能非常复杂的)方法中做其他事情,但会在某些条件下调用其父方法。

我可以只写

def print 
    if @num == 1 
     super 
    else 
     p "I'm the child" 
    end 
    end 

而且这样的作品,但如果它不只是一个简单的一行比较,而是在做很多值得被分离成另一种方法,复杂的东西?在决定应该调用父母的方法之前,可能需要做一些计算。

或者也许有不同的更好的方式来设计它。

+0

我不明白这里的问题。您仍然可以通过非常复杂的方法调用“超级”(即使在不同的分支甚至多次)。 – Koraktor

+0

'child_print'应该调用Parent的'print'。我认为super只是在超类中调用同名的方法。或者,我可能不知道如何正确使用'super'。甚至有一个'child_print'的原因是因为我不想让与它无关的东西膨胀到print方法,但仍然需要确定是调用孩子的打印还是父母的打印。 – MxyL

+0

啊,对不起。这里已经很晚了。 ;)一会儿。 – Koraktor

回答

1
Parent.instance_method(:print).bind(self).call 

这已经很可读了,但是这里有一个解释。

  1. 获取Parent
  2. #print方法绑定到您当前对象
  3. 说它

PS:您甚至可以将参数#call,他们将被转发到称为方法。

PPS:也就是说,这样的代码几乎总是在你的课堂设计中暗示一个问题。你应该尽可能避免它。

+0

我不喜欢我正在尝试做的事情,但我正在修改其他人的班级,他们提供了他们的界面和班级设计,因此我一直在努力尝试使用它。有些情况下,我需要调用父母的方法,其他情况下我运行自己的方法。可以用臃肿的方法解决,但我不喜欢大的方法.. – MxyL