【问题标题】:Ruby : How to call Derived Class Method in Base ClassRuby:如何在基类中调用派生类方法
【发布时间】:2014-03-11 20:53:23
【问题描述】:

我想在父类中访问派生类的方法。请指教

Class A

 def methodA
 end

 def methodB
 end

end

Class B < Class A

 def methodC
 end

 def methodD
 end

end

我想在methodB里面调用methodD

Class A
 def methodA
 end

 def methodB


 methodD
 end

end

谢谢。

【问题讨论】:

  • 非常奇怪的要求..需要破解:p
  • 这实际上是 OOP 中的一种标准做法,称为polymorphism。基本上,类AmethodD 的调用没有在代码中的那一点定义;可以说,它的多态取决于哪个派生类调用它。

标签: ruby oop


【解决方案1】:

您编写的内容有效,但对语法进行了一些清理。只要您的对象属于派生类B,那么它就知道methodD 是什么。相反,如果您在其上调用 methodBA 类的对象将抛出 NameError,因为它不知道 methodD 是什么。

class A

 def methodA
 end

 def methodB
   puts 'Called A#methodB'
   methodD
 end

end

class B < A

 def methodC
 end

 def methodD
   puts 'Called B#methodD'
 end

end

b = B.new
b.methodB
# Called A#methodB
# Called B#methodD

【讨论】:

    【解决方案2】:

    只需调用方法即可。

    class A
      def a
        b
      end
    end
    
    class B < A
      def b
        :b
      end
    end
    
    B.new.a
    # => :b
    

    调用方法会向接收者发送一条消息,在本例中为:b 消息。如果对象响应消息,那么一切都会正常进行。

    你也可以这样做:

    a = A.new
    
    def a.b
      :x
    end
    
    a.b
    # => :x
    

    【讨论】:

      【解决方案3】:

      看看Template Method设计模式

      Class A
       def methodA
       end
      
       def methodB
       end
      
       def methodD
        raise NotImplementedError, 'Sorry, you have to override it!'
       end
      end
      
      Class B < Class A
       def methodC
       end
      
       def methodD
        puts "methodD"
       end
      end
      

      在这种情况下,methodD 被称为Hook Method,因为基本上通知所有具体类该方法可能需要覆盖。这个想法是:如果未定义基本实现,则子类必须定义挂钩方法。

      【讨论】:

        猜你喜欢
        • 2014-09-05
        • 2013-04-11
        • 1970-01-01
        • 2014-03-17
        • 1970-01-01
        • 2016-01-01
        • 2012-04-28
        • 1970-01-01
        • 2019-07-25
        相关资源
        最近更新 更多