在其中一个大学课程中,我们必须用Java开发程序。其中一个要求是使用模式surname_firstname_exerciseN_className.java
命名所有文件。另一个要求是我们必须将程序拆分成多个文件。你可以想象,这两者并不能很好地融合在一起。
我正试图通过“翻译”我的班级名称来解决这个问题。例如,如果我写一个名为“Something”的类,我会在long_prefix_something.java
文件中执行此操作:
public class long_prefix_something extends Something {}
class Something {
// class code
}
我想在另一个文件中使用class Something。所以我在其他文件中执行此操作:
class Something2 extends long_prefix_something { }
令我困扰的是,由于循环继承错误,我无法将long_prefix_something
翻译回Something
,我必须改为使用Something2
。
无论如何要克服这个问题?要使用的任何注释或类似的东西吗?
答案 0 :(得分:1)
此类黑客的必要性通常是糟糕设计的标志。 java中不允许循环(和多个)继承。
答案 1 :(得分:1)
我同意(与其他评论者一样)这对我来说听起来有点吓人......但是,在那里,存在一些用于处理类似于你的问题的java惯例。
您似乎需要对其内部“更具描述性”的类 派生然后继承层次结构中的标准java类。
您可以通过两种标准方式满足您的需求:接口(编译时)或反射(运行时)。
虽然确切的解决方案不明确,因为您似乎在这里有一个非常复杂的代码方案, 这两个例子可以解决您遇到的问题:
第一种方法:使用接口。
1)将“Something”转换为界面 2)从中获取implmentation方法并将它们移植到SomethingImpl类 3)只需要“abcde12345_something”实现“Something”界面。
第二种方法:使用内省方法。
这是一种有点奇怪的方法,但是如果接口不起作用,你可以在你的类中添加更多钩子,允许它描述其他对象, 它是从哪种类型派生出来的。
1)很明显,你正在“包装”类 - 所以,你可以为你的包装类添加一个API,这样每个类都提供一个“getRootClass()”方法,如下所示:
public class abcde_12345_something extends Something implements RootClassProvider{
public Class getRootClass()
{
return Something.class;
}
}
2)现在,在runTime - 如果你不能(出于某种原因)需要对“Something”对象进行特殊的逻辑操作,你可以 致电
if(myabcd_12345.getRootClass().isAssignableFrom(Something))
Something s = (Something) myabcd_12345;
答案 2 :(得分:1)
我认为做他们打算做的最好的方法是使用包,而不是混淆类名......如果我是你,我建议你的老师:
即。 surname_firstname.exerciseN.ClassName而不是surname_firstname_exerciseN_className.java
答案 3 :(得分:0)
不,这在Java中是不可能的。
扩展将无效,并且Java中似乎不存在您想要的别名。