Ruby中的OOP混乱

时间:2014-05-15 02:22:38

标签: ruby oop

我想做这样的事情。这是一个类:

module MyModule
  class ClassOne
    def initialize
      @chain = []
    end

    def add_type_one(thing1, thing2)
      @chain << thing1 + thing2
    end

    def add_type_two(thing3, thing4)
      @chain << thing3 + thing4
    end

    def sanitize
      @chain.join(" ").gsub("this", "that")
    end
  end
 end

这是另一个类:

module MyModule
  class ClassTwo
    def initialize
      @other_chain = []
    end

    def add_more(thingA, thingB)
      @other_chain << thingA + thingB
    end

    def add_even_more(thingC, thingD)
      @other_chain << thingC + thingD
    end

    def run
      system('program #{@chain} #{@other_chain}')
    end
  end
 end

然后我想像这样称呼这些方法:

a = ClassOne.new
a.add_type_one("I", "Want")
a.add_type_two("These", "Methods")
a.sanitize

b = ClassTwo.new
b.add_more("And", "Variables")
b.add_even_more("To", "Work together")
b.run

要获得

的最终输出必须做些什么
system('program I Want These MethodsAndVariablesToWork together')

这个例子的关键在于我无法访问ClassTwo中的ClassOne方法或变量。

 b.run

需要从ClassOne获取一些消息或输出。我知道实例变量不能在类的实例之外访问,我知道我可以使用全局变量或常量并且可以工作 - 但这不是最佳实践。我不知道为什么这对我来说仍然不清楚。我错过了这个难题的一小部分。请指教。

2 个答案:

答案 0 :(得分:3)

想象一下,您有多个ClassOne实例。 ClassTwo怎么会知道要使用哪个实例?

您可以通过向ClassTwo中注入ClassOne实例来解决此问题。像这样

a = ClassOne.new
a.add_type_one("I", "Want")
a.add_type_two("These", "Methods")
a.sanitize

b = ClassTwo.new(a)
b.add_more("And", "Variables")
b.add_even_more("To", "Work together")
b.run

然后从ClassTwo中访问ClassOne的实例变量。

答案 1 :(得分:2)

以下列方式使用它,以便ClassTwo可以访问ClassOne,

module MyModule
   class ClassOne
   attr_reader :chain
      def initialize
         @chain = []
      end

      def add_type_one(thing1, thing2)
         @chain << thing1 + thing2
      end

      def add_type_two(thing3, thing4)
         @chain << thing3 + thing4
      end

      def sanitize
         @chain = @chain.join(" ").gsub("this", "that")
      end
   end

   class ClassTwo
      def initialize(obj)
         @classOne = obj
         @other_chain = []
      end

      def add_more(thingA, thingB)
         @other_chain << thingA + thingB
      end

      def add_even_more(thingC, thingD)
         @other_chain << thingC + thingD
      end

      def run
         system('program #{@classOne.chain} #{@other_chain.join}')
      end
   end
end