2010-12-14 10 views
0

話はこのようになります。Java:子クラスのインスタンス変数を変更する方法

私は抽象クラスAlgorithmsとそれを拡張する多くのクラスを持っています。それらの中には調整するパラメータがあります。いくつかはありません。いくつかは5までです。

私は任意のパラメータを調整できるアルゴリズムをアルゴリズムで使用したいと考えています。私が上でこのようにそれを呼び出すことができるように、例えば:

public static void tune (String paramName, double minValue, double MaxValue) 
{ ... } 

「クラスSoftRankBootsは、アルゴリズムの拡張」:SoftRankBoostはインスタンス変数「ダブルデルタ」を持っていることを

Algorithm srb = new SoftRankBoost(); 
srb.tune("delta", 0, 1); 

注意。

どうすればこの問題を解決できますか?

ありがとうございます。

+0

'srb.tune(" delta "、0、1)'を呼び出すとどうなりますか?最適なデルタを選択するために何らかの方法を使用していますか? (この場合、複数のパラメータを調整するときにどのように動作させたいのですか?) –

+0

@Michaelこれは、一度に1つのパラメータを調整するだけです。 while(...){blah.tune( "one"、0、1);で複数のパラメータを調整できます。 blah.tune( "two"、0、1); } – McTrafik

+0

@Michael抽象クラスアルゴリズムは明らかに、パラメータの現在の状態を考慮してパフォーマンスをテストする抽象メソッドを持っています。 – McTrafik

答えて

2

は反省APIを見てみましょう:

最終リンクは例のソースコードが含まれています。

注:Javaでリフレクションが必要な場合は、デザインがきれいでない可能性があります。

+0

Mhm:this.getClass()。getDeclaredField(paramName).setDouble(...); – McTrafik

+0

リフレクションが解決策である場合、デザインが問題である可能性が非常に高いです。 –

+0

@ラウレンス:同意。私のポストに短いメモを追加しました。 – miku

3

抽象クラスのメソッドチューンを実装する代わりに、実装クラスが実装する必要がある抽象メソッドを残します。

だから、あなたはあなたのより良いアドバイスを与えることは難しいやろうとしているかの全体像を見てアウトして

public abstract void tune (String paramName, double minValue, double MaxValue); 

。しかし、あなたが示唆していることは、一般的に悪い考えのように思えます。

+0

+1「あなたが示唆しているものは一般的に悪い考えのようです」 –

+0

一般的には悪い考えですが、これは該当するケースの1つです。 – McTrafik

0

「アルゴリズム」クラスのサブクラスはお互いに異なると思うので、Template MethodパターンまたはStrategyパターンは、あなたの問題を解決するためのいくつかの有用な概念を提供するかもしれません。

+0

私はすでにテンプレートメソッドを使用しています。あなたは1ビットではなく、その質問に答えていません。 – McTrafik

関連する問題