2

在 Java 中,我习惯于编写一个抽象类来完成一些设置工作,然后像这样委托给具体类:

public abstract class Base {
    public void process() {
        // do some setup
        //...

        // then call the concrete class
        doRealProcessing();
    }
     
    protected abstract void doRealProcessing();
}

public class Child extends Base {
    @Override
    protected void doRealProcessing() {
        // do the real processing
    } 
}

我在 Ruby 中很难做到这一点,因为我没有抽象类或方法。我还读到“你不应该在 Ruby 中需要抽象类或方法,我应该停止尝试用 Ruby 编写 Java”。

我很想知道在 Ruby 中实现等价的正确方法是什么?

4

3 回答 3

2

欢迎使用动态类型语言!您可能对定义一些未在任何地方声明的函数感到紧张。不要担心。这很容易:

class Base
  def process
     # ...
     real_processing
  end

  def real_processing    # This method is optional!
    raise "real_processing not implemented in #{self.class.name}"
  end
end

class Child < Base
   def real_processing
     # ...
   end
end

b = Child.new
b.process

编辑:这是您的另一个选择,它避免了需要有两个不同的方法名称:

class Base
  def process
    # ...
  end
end

class Child < Base
  def process
    # ...
    super   # calls the process method defined above in Base
    # ...
  end
end
于 2012-10-13T14:11:58.470 回答
0

以下是在 Ruby 中执行模板模式的方法:

class Template
  def template_method
    perform_step1
    perform_step2
    #do some extra work
  end

  def perform_step1
    raise "must be implemented by a class"
  end

  def perform_step2
    raise "must be implemented by a class"
  end
end

class Implementation < Template
  def perform_step1
    #implementation goes here
  end

  def perform_step2
    #implementation goes here
  end
end

http://andymaleh.blogspot.com/2008/04/template-method-design-pattern-in-ruby.html

于 2012-10-13T14:14:14.920 回答
0

对于这个用例,您在 Ruby 中看不到太多这样的内容,因为模式

  • 做一些家庭设置(例如连接到资源)
  • 用它做一些真实的事情
  • 拆解家务(fi close connection)

烘焙成普通方法:

# pseudocode:
def a_method(an_argument)
  # do some setup with an_argument
  yield(a_result)
  # do some teardown
end

# use like:
a_method(the_argument){|the_result| puts "real processing with #{the_result}"}
于 2012-10-13T21:16:13.383 回答