доступ к переменной из родительского класса - PullRequest
1 голос
/ 02 января 2012

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, чтобы отправить сообщение. Я не уверен, как это сделать, заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 02 января 2012

РЕДАКТИРОВАТЬ1 угадал справа:)

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

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

  • На самом деле вы не должны делать свойства общедоступными, они всегда должны быть частными или защищенными с помощью общедоступного метода получения / установки - таким образом вы можете ограничить доступ к свойствам и управлять тем, что происходит при получении или установке. (но это, как правило, очень утомительно в 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 голосов
/ 02 января 2012

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

0 голосов
/ 02 января 2012
int numB = A.bb.num;

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

...