2012-01-01 105 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); //<<<---- 
       } 
     } 
    }; 

} 

我是新来的类,抽象的,固有的等等。我需要能够通过gameRunner访问gameServer中的socketServer对象来发送消息。我不知道如何做到这一点,在此先感谢。

回答

4

EDIT1猜对了:)

设计有些话:

  • 大多数静是可怕的,你应该只让静态的属性时,他们是类如默认的一部分价值,Singleton生意,当你真的醉和懒惰 - 但这是一个不同的话题(你会得到的,如果你继续编码的坑)

  • 其实你的不应该公开属性,它们应该始终是私有的或者是受保护的,具有公共的getter/setter方法 - 这样,您可以限制对属性的访问并可以控制get或set上发生的事情。 (但是这往往是在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

你可以看看我的更新,感谢 – 2012-01-01 22:02:49

+0

+1回答什么问题应该是。 :-) – 2012-01-01 23:35:55

0
int numB = A.bb.num; 

应该这样做。然而,如果你可以描述你想要完成的工作,因为有一个由构造函数设置的静态变量(这就是你在的B中做的)最有可能不是一个好主意。此外,由于您使用的是“父”这个词,这听起来像您打算继承,但代码示例没有任何继承。

+0

我的工作在一个游戏服务器,我有一个对象“UdpServer”一个“主”类,而另一个“的PlayerController”,我想用UdpServer的发送功能从对象“的PlayerController”。 “UdpServer”有一个打开的UDP套接字,它固定在一个端口上。所以我不能创建一个“UdpServer”的新实例,我需要使用“main”类中的一个。 – 2012-01-01 21:39:08

+0

@PatrickLorio:我想我明白了 - 所以'Main'(相当于'A')包含一个静态'UdpServer'(相当于'B'),你想从'playerController'访问(这是一个实例'C')?你应该使用实际的类名称;这会让你的情况更容易理解。然后我显示的代码应该可以工作。但是,要注意静态实例通常会使代码不易测试;你应该考虑把'UdpServer'作为参数传递给'playerController'构造函数。 – 2012-01-01 22:03:37

0

在B中创建一个getter方法getNum() { return num; },并在C中调用B.getNum()。我不确定引用B的位置在哪里。C没有扩展B,那是你的意图吗?