Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 扩展基类方法(多态性)_Ruby_Oop_Polymorphism - Fatal编程技术网

Ruby 扩展基类方法(多态性)

Ruby 扩展基类方法(多态性),ruby,oop,polymorphism,Ruby,Oop,Polymorphism,我处理了继承问题,并尝试从基类到子类扩展一个方法。多态性。基本上,我尝试用一个附加选项扩展基本方法(status) 然而,由于某些原因,它并没有像预期的那样工作。我以为B.new.status(1)将返回2而不是零 如果我把super放在“y If opt==2”之后,那么结果是相反的 为什么会这样?我如何解决这个问题 非常感谢 class A attr_reader :x def initialize @x = 2 end

我处理了继承问题,并尝试从基类到子类扩展一个方法。多态性。基本上,我尝试用一个附加选项扩展基本方法(status)

然而,由于某些原因,它并没有像预期的那样工作。我以为B.new.status(1)将返回2而不是零

如果我把super放在“y If opt==2”之后,那么结果是相反的

为什么会这样?我如何解决这个问题

非常感谢

    class A
      attr_reader :x

      def initialize
        @x = 2
      end

      def status(opt)
        x if opt == 1
      end
    end

    class B < A
      attr_reader :y

      def initialize
        super
        @y = 10
      end

      def status(opt)
        super
        y if opt == 2
      end
    end

    B.new.status(1)
    => nil
    B.new.status(2)
    => 2
A类
属性读取器:x
def初始化
@x=2
结束
def状态(opt)
如果opt==1,则为x
结束
结束
B类零
B.新地位(2)
=> 2

如果If语句的编码不满足,则返回nil。所以你应该这样做:

if opt == 2
  y
else
  super
end

这是因为
A
状态的返回值未在
B
状态中使用。是的,在
A
的状态中,将返回
'x'
,但在
B
状态中不使用


方法中最后一条语句的结果是自动返回的,但是
super
不是
B
状态中的最后一条语句

opt==2?y:super
从设计的角度来看,最好对先调用基类函数的子类强制执行。这可以通过模板方法模式轻松实现。很好。您的意思是,我应该从类A中的status方法中删除代码,并将其放入类B的status方法中。因此,类B的status方法将具有:“x if opt==1”和“y if opt==2”。此外,我不再需要在status方法中调用super了,对吗?不,我的意思是A.status执行所有类型的通用工作,然后调用子类重写的(抽象)方法。这样,每个子类只实现子类特定的功能,而基类一劳永逸地实现协议。这是模板方法设计模式: