루비 - 클래스 상속 및 재정화 공장 방법으로 작동하도록 초기화
-
21-12-2019 - |
문제
여기에서 상속으로 무슨 일이 일어나고 있는지 모르겠습니다.이 코드에 대해 nil 값을 얻습니다.그러나 온도 클래스가 허용하는 것과 같이 INITIALISE 메소드를 무시하고 해시 인수를 통과 할 때 (: C=> 50) 그것은 잘 작동합니다.
공장 메소드가 이제는 이제 변경되는 초기화 방법을 다시 호출 할 수 있습니다.그러나 그때 나는 루프를 얻는 것으로 생각했을 것입니다 ..
고맙습니다.아래는 코드 세그먼트입니다.R-Spec 교육 자원
에 대한 솔루션입니다.나는 내 질문이 있다고 생각한다 :
Self.From_celsius 메소드가 온도에서 정의 된 초기화 방법으로 변환 방법을 호출하지 않는 새 인스턴스 객체를 생성하는 이유는 무엇입니까?
class Temperature
######################## -- getter methods
def in_fahrenheit
@in_fahrenheit
end
def in_celsius
@in_celsius
end
######################## -- initialize and call the calculations
def initialize(hash)
@options = hash
conversion
end
######################## -- calculations
def conversion
@options.key?(:c) ? @in_fahrenheit = (9.0/5.0*@options[:c].to_f) + 32.0 : @in_fahrenheit = @options[:f]
@options.key?(:f) ? @in_celsius = (5.0/9.0)*(@options[:f].to_f - 32.0) : @in_celsius = @options[:c]
end
######################## -- factory methods
def self.from_celsius(c)
self.new(:c => c)
end
def self.from_fahrenheit(f)
self.new(:f => f)
end
end
class Celsius < Temperature
def initialize(c)
Temperature.from_celsius(c)
end
end
class Fahrenheit < Temperature
def initialize(f)
Temperature.from_fahrenheit(f)
end
end
x = Celsius.new(50).in_celsius
puts x.nil?
#=> true
. 해결책
이것은 원하는 방식으로 작동합니다 :
class Celsius < Temperature
def initialize(c)
super(c: c)
end
end
class Fahrenheit < Temperature
def initialize(f)
super(f: f)
end
end
.
상속을 잘 사용하는 것이 아니라는 것이 명심해야합니다.
코드가 작동하지 않는 이유는 초기화 프로그램이 새로 생성 된 객체를 반환하지 않아도됩니다.새 호출은 개체를 만듭니다. 이니셜 라이저는 단지 초기화하는 것입니다.또한 attr_accessor
를 사용하여 Getter 코드를 정리해야합니다.
제휴하지 않습니다 StackOverflow