访问包私有子类的实例作为其 public 超类

Accessing instance of a package-private subclass as its public superclass

我正在编写一个多人游戏引擎,我将传统的 MVC 模式映射到 Game/Client/Server(游戏是其他部分作用和通信的 "model"。客户端有它的内部拥有 MVC 结构。)

我正在尽最大努力确保客户端和服务器包永远不会交叉,除非通过公共抽象进行通信。同样,游戏模型从不依赖于来自客户端或服务器的 classes。

但是我运行遇到了一个问题:

所以理想的解决方案(特别是 Player/User 问题)应该是这样的:

那么,我的问题是 Game 和 Client 包能否将这些对象作为 public superclass(Player)访问,即使实际上它是subclass属于另一个包? 从Game和Client的角度来看,他们只需要访问superclass methods/fields.

(此外,很明显,如果应用程序 运行 作为客户端,服务器将仅向其发送信息以创建 Player 对象。用户将仅存储在 dedicated/listen 实例上。)

我会对此进行测试,但我的游戏还远未通过编译(目前正在经历一场重构噩梦,需要清理新手错误)而且我不确定 IDE 是否会检测到任何运行时间冲突。

我同意你可以在一个新项目中非常快速地充实它,但我很好奇它究竟会如何运作,所以我还是做了:

一名玩家class:

package sandbox.pakcage1;

public class Player {
    public Player(String name) {
        this.name = name;
    }

    private String name;

    public String getName() {
        return name;
    }
}

一个用户class:

package sandbox.package2;

import sandbox.pakcage1.Player;

class User extends Player {
    private String userID;

    public User(String name, String id) {
        super(name);
        this.userID = id;
    }

    public String getUserID() {
        return userID;
    }
}

一个class生成一些用户:

package sandbox.package2;

import java.util.ArrayList;
import java.util.List;
import sandbox.pakcage1.Player;

public class UserBuilder {
    public static List<Player> getUsers() {
        List<Player> users = new ArrayList<>();

        users.add(new User("Joe", "1"));
        users.add(new User("Bob", "2"));

        return users;
    }
}

还有一条主线将它们联系在一起:

package sandbox;

import java.util.List;
import sandbox.package2.UserBuilder;
import sandbox.pakcage1.Player;

public class Sandbox {
    public static void main(String[] args) {
        List<Player> players = UserBuilder.getUsers();

        for(Player player : players) {
            System.out.println(player.getName());
        }
    }
}

您会发现 main 功能完美,从 User 对象访问 Player 数据成员就很好。但是,您不能将它们转换为用户对象,也不能以任何方式访问用户数据 - 因为 class 在不同的包中受到包保护。