2012-01-01 3 views
1

gameServer.java:доступ к переменным из родительского класса

import java.util.ArrayList; 

public class gameServer{ 

    public static server server; 
    public static gameRunner gameRunner; 
    public static ArrayList<packet> packets = new ArrayList<packet>(); 

    public static void main(String[] args) throws Exception { 
     server = new server(); 
     server.startServer(5050); 
     Runnable listenServer = new Runnable() { 
      public void run() { 
       while(true) { 
        packets.add(server.getPacket()); 
       } 
      } 
     }; 
     new Thread(listenServer).start(); 
     gameRunner = new gameRunner(); 
     while(true) { 
      if(packets.size() <= 0) 
       continue; 
      gameRunner.executeMessage(packets.get(0)); 
      packets.remove(0); 
     } 
    } 
} 

server.js:

import java.net.*; 
import java.util.Date; 

public class server { 

    public static DatagramSocket socketServer; 
    private Date date = new Date(); 

    public void startServer (int port) throws SocketException { 
     socketServer = new DatagramSocket(port); 
     System.out.println("Started Server on port: " + port); 
    } 
public void sendPacket (packet packet) { 
     String message = null; 
     for(int i = 0; i < packet.header.length; i++) { 
      message += packet.header[i] + "\r\n"; 
     } 
     message += "\r\n" + packet.message; 
     String[] info = packet.address.split(":"); 
     try { 
      sendPacket(message, (Inet4Address)InetAddress.getByName(info[0]), Integer.parseInt(info[1])); 
     } catch (Exception e) { 
      System.out.println("failed to determine host"); 
     } 
    } 

}

gameRunner.js:

import java.util.ArrayList; 
import java.util.Date; 


public class gameRunner { 

    public static ArrayList<object> objects = new ArrayList<object>(); 
    public static player[] players = new player[1000]; 

    public Date date = new Date(); 

    Runnable updatePlayers = new Runnable() { 
     public void run() { 
      while(true) { 
       long StartTime = date.getTime(); 
       for(int i = 0; i < players.length; i++) { 
        if(players[i] == null) 
         continue; 
        players[i].updatePos(); 
       } 
       while(StartTime + 100 < date.getTime()) { } 
      } 
     } 
    }; 

    Runnable sendPlayerPackets = new Runnable() { 
     public void run() { 
      while(true) { 
       parent.gameServer.sendPacket(player[0].packet); //<<<---- 
       } 
     } 
    }; 

} 

Я новичок классы, абстрактные, присущие и такие. Мне нужно иметь доступ к объекту socketServer в gameServer из gameRunner для отправки сообщения. Я не знаю, как это сделать, заранее.

ответ

4

EDIT1 угадал :)

Несколько слов о дизайне:

  • Большинство этих статик ужасны, вы должны только сделать свойство статическим, когда они являются частью класса, такими как значение по умолчанию значения, Singleton бизнес и когда вы действительно пьяны и ленивы - но это другая тема (вы получите это, если будете продолжать кодирование)

  • На самом деле вы с не должны делать свойства общедоступными, они всегда должны быть частными или защищенными, с общедоступным методом getter/setter - таким образом вы можете ограничить доступ к свойствам и управлять тем, что происходит при получении или установке. (Но это, как правило, очень утомительно в Java)

Теперь, сохраняя при статике вы можете легко отправить сообщение, как это (в sendPlayerPackets.run()): server.sendPacket(player[0].packet);

Чтобы передать серверу наряду с gameRunner вы могли бы сделать:

(в gameRunner.java)

public class gameRunner { 
    public static ArrayList<object> objects = new ArrayList<object>(); 
    public static player[] players = new player[1000]; 

    public server gameServer; 

    /* ... */ 
    Runnable sendPlayerPackets = new Runnable() { 
    public void run() { 
     while(true) { 
      gameServer.sendPacket(gameRunner.players[0].packet); //<<<---- 
      } 
    } 
}; 

и в gameServer.java:

public class gameServer{ 
    /* ... */ 
    public static void main(String[] args) throws Exception { 
    /* ... */ 
    gameRunner = new gameRunner(); 
    gameRunner.gameServer = server; 
    /* ... */ 
    } 
} 

старая часть

Чисто инстинктивно я думаю, вы хотите:

public class A { 
    public B foo; 
    public C bar; 

    public A() { 
     // java does not like exposing this, but screw that 
     foo = new B(this, 10); 
     C = new C(this); 
    } 
} 

public class B { 
    private class A parent; 
    public int numB; 

    public B(A parent, int num) { 
     this.parent = parent; 

     numB = num; 
    } 
} 

public class C { 
    private class A parent; 
    public int numC; 

    public C(A parent) { 
     this.parent = parent; 

     if(parent != null && parent.B != null) 
     numC = parent.B.numB; 
    } 
} 

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

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

+0

не могли бы вы взглянуть на мое обновление, спасибо –

+0

+1 за ответ на вопрос, который должен был быть. :-) –

0
int numB = A.bb.num; 

должен это сделать. Однако было бы полезно, если бы вы могли описать то, что вы пытаетесь выполнить, потому что наличие статической переменной, заданной конструктором (что вы делаете с num в B), скорее всего, не очень хорошая идея. Кроме того, поскольку вы используете слово «родительский», это похоже на то, что вы намереваетесь выполнять наследование, но пример кода не имеет наследования.

+0

Я работаю над игровым сервером, и у меня есть «основной» класс с объектом «UdpServer», а другой «playerController», я хочу использовать функцию отправки UdpServer из объекта «playerController». «UdpServer» имеет открытый UDP-сокет, который привязан к порту. Поэтому я не могу создать новый экземпляр «UdpServer», мне нужно использовать его в «основном» классе. –

+0

@PatrickLorio: Думаю, я понимаю - поэтому 'Main' (что соответствует' A') содержит статический 'UdpServer' (который соответствует' B'), к которому вы хотите получить доступ, из 'playerController' (который является экземпляром 'C')? Вы должны были использовать фактические имена классов; это упростило бы вашу ситуацию. Тогда код, который я показал, должен работать. Однако будьте осторожны, что статические экземпляры часто делают код менее проверяемым; вам следует рассмотреть возможность передачи 'UdpServer' в качестве параметра в конструктор' playerController'. –

0

Создайте метод getter, getNum() { return num; }, в B и позвоните B.getNum() в C. Я не уверен, где находится ссылка на B. C не расширяет B, это то, что вы намереваетесь?

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