状況:構成ハッシュを持つ変数をそれぞれ保持する複数のクラスがあります。クラスごとに異なるハッシュですが、クラスのすべてのインスタンスで同じです。Ruby:クラス変数で動作するコードを継承する
:最初、私はこのように、BまたはCではない、このclass A
def self.init config
@@config = config
end
def config
@@config
end
end
class B < A; end
class C < A; end
ようにしようとしたが、すぐに設定がAのコンテキストに保持されている@@ので、それはそのように動作しないことに気づいた時に
B.init "bar"
p B.new.config # => "bar"
p C.new.config # => "bar" - which would be nil if B had it's own @@config
C.init "foo"
p B.new.config # => "foo" - which would still be "bar" if C had it's own @@config
p C.new.config # => "foo"
私はこのようにそれを使用するのではと思った:それはなぜ起こるか
modules = [B, C]
modules.each do |m|
m.init(@config[m.name])
end
# ...
B.new # which should then have the correct config
は今、それは私には明らかだが、私は目についてはよく分かりませんそれがこのような理由です。
クラス変数をサブクラスのコンテキストで保持することは、他の方法でも機能しませんか?私も刺激性が自己を常にスーパークラスの中に 'と呼ばれるも、サブクラスであるということがわかった何
。これから、スーパークラスのコードがサブクラスのコンテキストで実行されることが最初に予想されました。
これについてのいくつかの啓発は非常に高く評価されます。一方
、私はおそらくそれがそのように動作し、私はこれを行うための別の方法を見つける必要があることを受け入れなければなりません。
これを行うための「メタ」方法はありますか? (私はclass_variable_setなどで頑張ってみましたが)
最初に「init」メソッドに欠陥があり、これを行うための他の「パターン」がありますか?
すべての設定を保持し、常に正しいものを選んで@@ configをハッシュにすることはできますが、少し厄介です。(この種の問題を解決するための継承はありません;)
デザインがどのようになっているかはわかりません。それは一般的に行うには十分な妥当なもののようです。 – Chuck
これはまさに私が知る必要があったことです、ありがとう! :) 本当に他に何を言うべきか分からない、今はっきりしている。 initメソッドは複数の変数を設定することを意図していましたが、わかりやすくするためにconfigサンプルがあります。しかし今、あなたはそれを言います、それはおそらくアクセサでもっときれいでしょう;) もう一度、ありがとう! –
@Chuck:たとえば、インスタンスメソッドを呼び出さず、インスタンス状態にアクセスしたり、オーバーライドしたりしないインスタンスメソッド( 'A#config')があります。それはトリミングされた例のアーティファクトかもしれませんが、合法的なデザインかもしれませんが、そうではないかもしれません。また、BとCはAから継承していますが、何もオーバーライドしませんが、それらはまったく同じですが、何らかの形でお互いにもAからも異なると予想されます。もう一度:分かりやすいかもしれません。それはすべて文脈に依存しますが、この例では賢明な結論に達するには小さすぎます。 –