【发布时间】:2014-08-18 00:31:42
【问题描述】:
我知道这个问题已经被问过一百万次了,但我找不到合适的答案。
我有一堆信使方法,如debug(String) 和tell(CommandSender, String),我想使用各种类。这听起来简单易行,但 Java 缺乏对多重继承的支持,这使得对于已经必须扩展其他内容的类来说,这个问题变得异常困难。
据我所知,接口不起作用,因为接口不允许您实际实现放入其中的方法。
我曾考虑向该方法添加额外的参数,以使它们在静态实用程序类中工作,但这会使对方法的调用从 debug(String) 变为 MessageUtil.debug(Plugin, String),这比我想要的要庞大得多。
我考虑过制作一个可以处理这些消息的 Messenger 对象,这样我就可以调用messenger.debug(String),这样更好,但我无法摆脱这样的感觉,即必须有更好的方法来单独获取debug(String)。
有什么建议吗?
编辑: 不幸的是,如果不添加额外的参数,这些方法就不能成为静态的;因此,静态导入将不起作用。
编辑: 这是我尝试在多个类中使用的方法之一的示例。正如你所看到的,它使用“plugin”和“debuggers”等非静态全局变量,它不能被设为静态。
protected myPlugin plugin;
private myList<String> debuggers = new myList<String>();
public void debug(String message) {
if (debuggers.size() == 0)
return;
if (debuggers.contains("\\console")) {
plugin.getServer().getConsoleSender().sendMessage(plugin.getColor() + message);
if (debuggers.size() == 1)
return;
}
for (Player player : plugin.getServer().getOnlinePlayers())
if (debuggers.contains(player.getName()))
player.sendMessage(plugin.getColor() + message);
}
这是另一个使用与上述相同的全局变量向服务器上的每个玩家和控制台广播消息的示例:
public void broadcast(String message) {
for (Player player : mCL.getServer().getOnlinePlayers())
player.sendMessage(plugin.getColor() + message);
mCL.getServer().getConsoleSender().sendMessage(message);
}
编辑:上面的broadcast() 方法实际上不是静态的;那是一个复制粘贴错误。我已经对其进行了修改以反映这一点。
【问题讨论】:
-
如果您发现缺少类的多重继承是个问题,那么您应该认真检查一下您的类层次结构。在大多数情况下,多重继承不应该是您在 Java 中依赖/需要的东西。
-
您建议我如何修改它以避免多重继承?我不想依赖多重继承(因为我不能使用它),但我不知道另一种好方法。
-
组合优于继承。
-
你反对静态导入吗?
-
好吧
broadcast()可以是静态导入。您的debug()方法似乎有很多状态。将MessageUtil实例传递给您的调用者,或使用 Singleton。
标签: java class inheritance multiple-inheritance