从父类访问变量

时间:2012-01-01 21:27:23

标签: java class parent

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对象以发送消息。我不确定如何做到这一点,提前谢谢。

3 个答案:

答案 0 :(得分: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之前初始化,为了解决这个问题,我需要事件。无论如何,这个想法似乎没有明确定义,你应该考虑一下你想要完成什么(并告诉我们)。

答案 1 :(得分:0)

int numB = A.bb.num;

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

答案 2 :(得分:0)

在B中创建一个getter方法getNum() { return num; },并在C中调用B.getNum()。我不确定B的引用在哪里.C不扩展B,是你想要的?