2012-01-01 229 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,那是你的意圖嗎?