2013-10-04 1 views
0

Я пытаюсь использовать композицию для разложения функциональности, но не уверен, как обратиться к классу «инкапсуляции» (не уверен, что уровень вверх называется по составу). Вот надуманный пример, где Тело может видеть методы Нога, но Нога не может видеть методы тела. Мне нужно изменить модификатор доступа или создать экземпляр по-разному? Заранее спасибо.Как получить доступ к методам «контейнера» из класса «has-a» (содержится)

public class Body { 

    private Leg leg; 

    public Body() { 
     leg = new Leg(); 
    } 

    public void takeStep() { 
     leg.move(); 
    } 

    public Boolean isStanding() { 
     return true; 
    } 

    public static void main(String[] args) { 
     Body body = new Body(); 
     body.takeStep(); 
    } 
} 

``

public class Leg { 

    public void move() { 
     if(body.isStanding()) // PROBLEM: no access to body 
      ; // <extend details> 
    } 
} 
+0

Я думаю, вы также можете попробовать, как общественный ничтожной takeStep() { \t если (isStanding()) \t \t leg.move(); } – upog

+0

'body' является ** локальной ** переменной метода' main'. Он не может быть виден вне метода. –

ответ

0

Вы можете получить доступ к методам контейнера, передавая свою ссылку при инстанцировании содержащийся класс. Таким образом, вы бы объявить Leg класс как

public class Leg { 

    Body parent; 

    public Leg(Body parent) { 
     this.parent = parent; 
    } 

    public void move() { 
     if(parent.isStanding()) // PROBLEM: no access to body 
      ; // <extend details> 
    } 

} 

Вы бы создать экземпляр Leg в Body в

public Body() { 
    leg = new Leg(this); 
} 
0

Я думаю, вы можете попробовать, как показано ниже, передавая значение в качестве аргумента

public class Body { 

    private Leg leg; 

    public Body() { 
     leg = new Leg(); 
    } 

    public void takeStep() { 
     leg.move(isStanding()); 
    } 

    public Boolean isStanding() { 
     return true; 
    } 

    public static void main(String[] args) { 
     Body body = new Body(); 
     body.takeStep(); 
    } 
} 
class Leg{ 
    public void move(boolean isStanding){ 
     if(isStanding){ 
      // your code 
     } 
    } 
}