0

を拡張するクラスを作成していますPropertyChangeSupport。私が現在やりたいことはオーバーライドfirePropertyChange()です:

PropertyChangeSupport に実装されている firePropertyChange:

public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
        firePropertyChange(new PropertyChangeEvent(this.source, propertyName, oldValue, newValue));
    }
}

私の意図したオーバーライドfirePropertyChange

public void firePropertyChange(String propertyName, Object oldValue, Object newValue) {
    if (oldValue == null || newValue == null || !oldValue.equals(newValue)) {
        firePropertyChange(new JoystickPropertyChangeEvent(this.source, propertyName, oldValue, newValue)); //compile error: source is not visible
    }
}

JoystickPropertyChangeEvent私が作成し、拡張するクラスですProperyChangeEvent

問題は、ソースがプライベートでgettersinがないため、意図した実装がコンパイルされないPropertyChangeSupportため、サブクラスがそれにアクセスできないことです。PropertyChangeSupportのコードを変更できません。

ソースのプライベートコピーをサブクラスのフィールドとして持つよりも、これを解決するよりエレガントな方法はありますか?

関連する質問: サブクラス内のクラスのプライベート変数にアクセスする方法は?

4

5 に答える 5

1

私はこれの設計に疑問を呈します。

オーバーライドしようとしているメソッドは、何らかの理由で非公開にされています。実装を変更できたとしても、これが他の場所にどのような影響を与えるかわからないため、お勧めしません。

于 2013-07-25T11:57:08.913 に答える
1

あなたが本当に愚かだったら、この問題をリフレクションで解決しようとするかもしれません。しかし、それは非常に複雑なので、もう一度言及することさえできません.

あなたの目標は、プロパティ変更リスナーがいくつかのイベントを他のイベントと区別できるようにすることです。聞き手が助けなしでそれらを区別できる場合は、それを行ってください. それが不便な場合は、静的メソッドを提供してプロパティ変更イベントを分析し、それがJoystickPropertyChangeEvent.

また、なぜプロパティ変更イベントを使用する必要があるのでしょうか? ジョイスティックの状態が更新されたときにイベントを発生させたい場合は、独自のカスタム イベントを発生させる必要があります。

于 2013-07-25T12:00:08.970 に答える
0

この目的でリフレクションを使用できます。

ParentClass プライベート変数が次のような場合

private String private_source_parent = "some_value";

親クラスを拡張する ChildClass 内

ParentClass obj = new ParentClasS();
Field f = obj.getClass().getDeclaredField("private_source_parent"); //NoSuchFieldException
f.setAccessible(true);
String source_inchild = (String) f.get(obj);

ここで ChildClass では、親のプライベート メンバーの値を取得します。

于 2013-07-25T12:14:57.983 に答える
-1

スーパークラスの getter メソッドを使用して、ソース プロパティを取得できます。

super.firePropertyChange(new JoyStickPropertyChangeEvent(super.getSource, propertyName, oldValue, newValue); 

これでうまくいくはずです。説明として、スーパークラスの firePropertyChange メソッドを明示的に呼び出す必要があります。これはキーワード super で行います。

お役に立てれば

乾杯

于 2013-07-25T11:59:39.347 に答える