2016-06-10 5 views
1

Ive попытался найти и прочитать прогиб (похожее звучание), но я не могу найти решение.Вызов метода из объекта в Object? (Java)

В настоящее время я делаю прототип для управления некоторыми лампами с текстовым вводом. Ввод текста уже работает, и он может корректно фильтровать входные сигналы и выбирать только соответствующие части.

В любом случае, для этого мне нужно сначала создать Объекты моего дома, которые содержат все этажи, в которых есть все комнаты, в которых есть все актеры (лампы и т. Д.).

Это фрагменты для всех этих объектов, сверху вниз, поскольку они должны быть уложены внутри друг друга (код еще не завершен и не оптимизирован, я знаю, что могу использовать ключ-переключатель для всех операторов if-else) :

import java.util.ArrayList; 

public class Building { 
    String Name; 
    ArrayList<floor> floor = new ArrayList<floor>(); 

    public Building(String Name){ 
     this.Name = Name; 
    } 

    public boolean checkFloor(String Name){ 
     int count = floor.size(); 
     boolean ret = false; 
     while(count < floor.size()){ 
      if (floor.get(count).Name == Name){ 
       count = floor.size(); 
       ret = true; 
      } 
      count++; 
     }   
     return(ret); 
    } 

    public void newFloor(String Name){ 
     Name = Name.toLowerCase(); 
     if (Name == "keller" || Name == "basement"){ 
      floor basement = new floor("basement"); 
      floor.add(basement); 
     } 
     else if (Name == "eg"){ 
      floor ground = new floor("eg"); 
      floor.add(ground); 
     } 
     else if (Name == "1og"){ 
      floor first = new floor("first"); 
      floor.add(first); 
     } 
     else if (Name == "2og"){ 
      floor second = new floor("second"); 
      floor.add(second); 
     } 
     else if (Name == "3og"){ 
      floor third = new floor("third"); 
      floor.add(third); 
     }  
      }  
    public void newRoom(String Floor, String Name){   
    } 

} 

public class floor { 
    String Name; 
    ArrayList<room> room = new ArrayList<room>(); 
    transcoder transcode = new transcoder(); 

    public floor(String Name){ 
     this.Name = Name; 
    } 



    public boolean checkRoom(String Name){ 
     int count = room.size(); 
     boolean ret = false; 
     while(count < room.size()){ 
      if (room.get(count).Name == Name){ 
       count = room.size(); 
       ret = true; 
      } 
      count++; 
     } 

     return(ret); 
    } 

    public void newRoom(String mName){ 
     String Name = transcode.getRoom(mName); 
     if(Name == "ground"){ 
      room ground = new room("ground"); 
      room.add(ground); 
     } 
     else if (Name == "basement"){ 
      room basement = new room("basement"); 
      room.add(basement); 
     } 
     else if (Name == "first"){ 
      room first = new room("first"); 
      room.add(first); 
     } 
     else if (Name == "second"){ 
      room second = new room("second"); 
      room.add(second); 
     }  
    } 
} 

public class room { 
    String Name; 
    ArrayList<Actor> Actors = new ArrayList<Actor>(); 

    public room(String Name){ 
     this.Name = Name; 
    } 

    public void addActor(String Name, int Type, String Address, int Channel, boolean Dim){ 
     Actors.add(new Actor(Name, Type, Address, Channel, Dim)); 
    } 

    public void removeActor(String Name){ 
     int count = 0; 
     while (count <= Actors.size()){ 
      if (Actors.get(count).Name == Name){ 
       Actors.remove(count); 
       count = Actors.size(); 
      } 
      count++; 
     } 
    } 

    public boolean containsActor(String Name){ 
     int count = 0; 
     boolean ret = false; 
     while (count < Actors.size()){ 

       if (Actors.get(count).Name == Name){ 
        ret = true; 
        count = Actors.size(); 
       } 
       count++; 
      } 
     return(ret); 
    } 

    public String getAddress(String Name){ 
     int count = 0; 
     String ret = "leer"; 
     while (count < Actors.size()){ 
      if (Actors.get(count).Name == Name){ 
       ret = Actors.get(count).Address; 
       count = Actors.size(); 
      } 
      count++; 
     } 
     return(ret); 
    } 

    public int getType(String Name){ 
     int count = 0; 
     int ret = 0; 
     while (count < Actors.size()){ 
      if (Actors.get(count).Name == Name){ 
       ret = Actors.get(count).Type; 
       count = Actors.size(); 
      } 
      count++; 
     } 
     return(ret); 
    } 

} 

public class Actor { 
    String Name; 
    String Address; 
    int Channel; 
    int Type; 
    boolean Dim; 
    int On; //muss noch deklariert werden! 
    int Off; 


    public Actor(String Name, int Type, String Address, int Channel, boolean Dim){ 
     this.Name = Name; 
     this.Type = Type; 
     this.Address = Address; 
     this.Channel = Channel; 
     this.Dim = Dim; 
    } 
} 

То, что я пытаюсь сделать сейчас в своем Mainclass, заключается в создании нового здания с полом, комнатой и несколькими актерами. Код идет следующим образом:

System.out.println("Gebäudename eingeben(egal): "); 
String Name = user_input.nextLine(); 
Building Building = new Building(Name); 
System.out.println("Stockname eingeben(eg): "); 
Name = user_input.nextLine(); 
Building.newFloor(Name); 
System.out.println("Raumname eingeben(wohnen): "); 
Name = user_input.nextLine(); 
Building.floor 

Теперь в конце в Building.floor, я не совсем понимаю, как я могу теперь добавить новый номер для объекта этажа. Я ценю любую помощь, так как Im не совсем интересуется Java еще и, вероятно, не хватает очевидной части.

+0

http://stackoverflow.com/help/how-to-ask http://stackoverflow.com/help/mcve –

ответ

1

Чтобы ответить на ваш вопрос, самый простой способ добавить новую комнату к полу здания, таким образом:

Building.floor.get(0).newRoom(Name);

floor является ArrayList и вызова get() на первый индекс позволит вам тогдашнему позвоните по телефону newRoom().

Некоторые предложения, чтобы сделать код более читаемым/понятно:

  • капитализировать свои имена классов, изменяя floor к Floor и room к Room.

  • Измените имя вашего ArrayList от floor до floors.

  • Измените имя вашего ArrayList от room до rooms.
  • Объявите отдельные переменные String в вашем основном классе для хранения пользовательского ввода.
  • Храните ваши объекты отдельно, прежде чем добавлять в соответствующий ArrayList.

Самая важная вещь, которую я бы сказал добавить, - это метод getFloor() для вашего класса Building.

как это (предполагая, что вы делаете вышеуказанные изменения):

public Floor getFloor(String floorName){ 
    Floor correctFloor = null; 
    for(Floor floor : floors) { 
     if(floor.Name == floorName) { 
      correctFloor = floor; 
     } 
    } 
    return correctFloor; 
} 

Затем вместо

System.out.println("Gebäudename eingeben(egal): "); 
String Name = user_input.nextLine(); 
Building Building = new Building(Name); 
System.out.println("Stockname eingeben(eg): "); 
Name = user_input.nextLine(); 
Building.newFloor(Name); 
System.out.println("Raumname eingeben(wohnen): "); 
Name = user_input.nextLine(); 
Building.floor.get(0).newRoom(Name); 

вы можете положить (снова предполагая, что вышеуказанные изменения)

System.out.println("Gebäudename eingeben(egal): "); 
String buildingName = user_input.nextLine(); 
Building building = new Building(buildingName); 
System.out.println("Stockname eingeben(eg): "); 
String floorName = user_input.nextLine(); 
Floor floor = new Floor(floorName); 
building.newFloor(floorName); 
System.out.println("Raumname eingeben(wohnen): "); 
String roomName = user_input.nextLine(); 
building.getFloor(floorName).newRoom(roomName); 

Это всего лишь предложения, и есть много способов сделать это. ~ Удачи!

+1

Спасибо, что работает. Спасибо за советы по форматированию, сделают это. Единственная причина, по которой у меня сейчас нет метода getFloor, заключается в том, что я не совсем сделал, я постоянно прорабатываю прототипы (вот почему код в основном методе выглядит так, как сейчас, его просто для быстрого тестирования). Сообщайте мне, когда Im дальше вперед! :) – Redimo

+0

Удивительный! Рад, что я мог бы помочь: D – Danoram

1

В вашем классе здания используйте геттеры и сеттеры. У вас есть переменная floor, но у вас нет способа ее получить. Добавьте этот геттер в Building

public ArrayList<floor> getFloors(){ 
     return floor; 
    } 

Тогда в вместо того, чтобы говорить Building.floor вы можете сказать что-то вроде

int floorToGet = (what ever floor in the ArrayList you want); 
Building.getFloors.get(floorToGet).newRoom("New Room Name"); 

Кроме того, если бы я сделать пару предложение о вашем стиле кодирования, а также некоторые советы. По соглашению все классы начинаются с верхнего регистра, т. Е. Building, в отличие от building, вы делаете это в некоторых классах, но не в других. Кроме того, если вы хотите использовать синтаксис типа Building.floor, это хорошая идея, чтобы сделать эту переменную static. В противном случае создайте геттеры/сеттеры для переменных и создайте новый объект для строительства. А также по соглашению имена переменных начинаются с нижнего регистра, т. Е. В этом случае Building building = new Building(), то, что у вас есть, похоже на ваш доступ к статической переменной, которая на самом деле не является статической.

Последнее предложение, если вы знакомы с этой концепцией. Это может сделать доступ к данным более простым, если вы подклассифицируете некоторые из ваших классов. И я имею в виду, что в зданиях есть Полы, а Полы - Комнаты. Так что если это не смущает, Building будет вашим основным классом, а затем Floors extends Building и Room extends Floor.

С логической точки зрения я считаю, что это имеет смысл. Но, надеюсь, это помогает.

+0

Спасибо, я попробую это. (goddamit enter автоматически отправляет мой ответ!) У меня есть здание, этаж и т. Д. Как отдельные классы. Они просто не расширяют друг друга. Будет ли это необходимо? То, что я делаю, - это в основном текстовый ввод, например «Поверните стеновую панель на кухне», из которой он фильтрует все, кроме «wallamp» «кухня» «on», а затем он ищет адрес «wallamp», в «кухне» и отправляет TCP-пакет для включения лампы. – Redimo

+0

Нужен? Нет. Вы можете сделать это так, как вы делаете. Моя внутренняя логистика просто не могла не сделать этого предложения. Если это то, что вы планируете поддерживать (кодовое), подклассы могут очистить его. Но если вы просто бросаете это вместе, а затем хотите забыть об этом, как только это произойдет, то, вероятно, это не имеет значения. –

+0

Я вижу. Так что я думаю, что производительность разумна, это не изменит ситуацию? Это моя самая большая забота. И нет, я планирую сделать этот текущий проект. – Redimo

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