-1

抽象スーパークラスを抽出するクラスをリファクタリングする必要があります。例えば

UpperClass {
NestedClass {
UpperClass.this.someMethod();
}
}

お気に入り:

AbstractUpperClass {
    NestedClass {
  ?????.this.someMethod();
  }
}

私は2つのクラスUpperClass1とUpperClass2でAbstractUpperClassを継承する予定です。しかし、この内部クラスをリファクタリングする方法がわかりません。これは、クラスを囲むメソッドを呼び出すためです。可能ですか?ありがとう。

4

1 に答える 1

0

ここでの秘訣は、内部クラスがどのように機能するかを知ることです。これは本質的に単なる「通常の」静的クラスですが、そのコンストラクターは暗黙的に外側のクラスへの参照を取得します。したがって、この:

public class TopLevel {

    public void go() {
        new Inner().bar();
    }

    public void foo() { }

    public class Inner {
        public void bar() {
            TopLevel.this.foo();
        }        
    }
}

これと同等です:

public class TopLevel {

    public void go() {
        new Inner(this).bar();          // explicitly passing in "this"
    }

    public void foo() { }

    public static class Inner {
        private final TopLevel parent;  // note that we have this new field

        public Inner(TopLevel parent) { // note this new constructor
            this.parent = parent;
        }

        public void bar() {             // we use the explicit reference instead
            parent.foo();               // of the implicit TopLevel.this
        }        
    }
}

つまり、内部クラスをトップレベル クラスにリファクタリングする方法は、インスタンスを参照する明示的なフィールドを追加し、この参照をコンストラクターUpperClassに渡すことです。NestedClassつまり、最初のコード スニペットではなく、2 番目のコード スニペットのようになります。

于 2012-05-29T16:16:56.640 に答える