2012-05-29 3 views
-1

Мне нужно рефакторинг класса, извлекающего абстрактный суперкласс. .Как переместить вложенный класс в суперкласс в java?

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

Как:

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

После того как я планирую наследовать AbstractUpperClass в 2-х классах UpperClass1 и UpperClass2. Но я не знаю, как реорганизовать этот внутренний класс, потому что он вызывает метод включения класса. Это возможно? Спасибо.

+2

Когда вы говорите «верхний», вы имеете в виду «супер», или это какое-то диджейское программное обеспечение для празднования юбилея, которое вы пишете? 8 = \/ – davidfrancis

+0

Просто используйте AbstractUpperClass.this.someMethod() – Yura

+3

Ваш код непонятен. Можете ли вы предоставить действительный [SSCCE] (http://sscce.org/)? –

ответ

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. Другими словами, будьте похожи на этот второй фрагмент кода вместо первого.

Смежные вопросы