2013-09-22 2 views
0

Рассмотрите класс, скрывающий член от суперкласса. Если вы выполняете клонирование, то как правильно обновлять оба элемента?Возможно ли получить доступ к скрытому полю из внешнего объекта в Java?

public class Wrapper implements Cloneable{ 
    protected Collection core; 
    protected Wrapper(Collection core) { 
     this.core = core; 
    } 
    public Wrapper clone() { 
     try { 
     Wrapper ans = (Wrapper) super.clone(); 
     ans.core = (Collection) core.getClass().newInstance(); 
     for(Object o : core) { 
      ans.core.add(o.clone()); 
     } 
     return ans; 
     } 
     catch(CloneNotSupportedException e) { 
     throw new AssertionError(e); 
     } 
    } 
} 

public class Child extend Wrapper { 
    protected ArrayList core; // for simpler access 
    public Child() { 
     super(new ArrayList()); 
     this.core = (ArrayList) super.core; 
    } 
    public Child clone() { 
     Child ans = (Child) super.clone(); 
     ans.core ... // how to update both core members? 
     // ans.super.core ... ? 
     // ans.this.core ... ? 
    } 
} 

ответ

1

Стандартный способ бросить Child к Wrapper для того, чтобы получить доступ к его скрытое поле.

Простой пример:

public class Test { 

public static class A { 
    protected String field = "I'm class A"; 
} 

public static class B extends A { 
    protected String field = "I'm class B"; 
} 

/** 
* @param args 
*/ 
public static void main(String[] args) { 
    B b = new B(); 
    System.out.println(b.field); // prints "I'm class B" 
    System.out.println(((A) b).field); //prints "I'm class A" 
} 

} 

Но почему вы скрыть поле? Это приводит к ошибкам программирования и делает ваш код трудным для чтения. Я бы предложил получить доступ к полю с помощью геттеров и сеттеров. Фактически, я предлагаю объявить абстрактные геттеры и сеттеры в Wrapper, чтобы заставить подклассы предоставить соответствующее поле.

С наилучшими пожеланиями,

СЭМ

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