[英]Java: extending Object class
我正在编写(好,完成)Java的“扩展”,这将有助于角色编程。
我用javacc将代码翻译成Java代码。 我的编译器为每个声明的类添加了一些代码。 这是一个更清晰的例子:
MyClass extends String implements ObjectWithRoles { //implements... is added
/*Added by me */
public setRole(...){...}
public ...
/*Ends of stuff added*/
...//myClass stuff
}
它为您声明的每个单一类添加了Implements ..和必要的方法。 相当粗糙,不是吗?
如果我在一个类中编写我的方法并且所有类都扩展了那个...但是..如果类已经扩展了另一个类(就像示例那样)会更好吗?
我不想创建一种管理角色的包装器,因为我不希望程序员必须知道的不仅仅是Java,很少有新的保留字及其用法。
我的想法是扩展java.lang.Object ..但你不能。 (对?)
其他想法?
我是新来的,但我关注这个网站,谢谢你的阅读和你给出的所有答案! (我为英语道歉,我是意大利人)
如果它只是一个“研究”项目,您想要探索这种扩展如何工作,您可以提供自己的Object
类实现。 只需复制现有的对象实现,添加setRole
方法等,并将-Xbootclasspath:.:/usr/lib/jvm/java-6-sun/jre/lib/rt.jar
作为java命令的参数。 (我将寻找API类中.
寻找在现实面前rt.jar
)。
Object
- 每个类都扩展它。 如果要添加功能,请使用对象组合。 也就是说,
YourClass extends Whatever implements ObjectWithRoles { private RoleHandler roleHandler; public RoleHandler getRoleHandler() {..} // defined by the interface }
然后所有方法都放在RoleHandler
你应该考虑使用组合而不是继承来解决这个问题; 通过这种方式,您可以提供所需的功能,而无需在继承中使用“一次性”。
例如,JDK提供了一个类PropertyChangeSupport
,它可用于管理PropertyChangeListener
和触发PropertyChangeEvent
。 在您希望编写触发PropertyChangeEvent
的类的情况下,您可以嵌入PropertyChangeSupport
实例变量并将所有方法调用委托给它。 这避免了对继承的需要,并且意味着您可以使用新功能补充现有的类层次结构。
public class MyClass extends MySuperClass {
private final PropertyChangeSupport support;
public MyClass() {
this.support = new PropertyChangeSupport(this);
}
public void addPropertyChangeListener(PropertyChangeListener l) {
support.addPropertyChangeListener(l);
}
protected void firePropertyChangeEvent() {
PropertyChangeEvent evt = new ...
support.firePropertyChangeEvent(evt);
}
}
如果您正在谈论为所有对象添加角色,我还会考虑基于注释的解决方案。 你可以用@Role(“User”)之类的东西来注释你的类。 在另一个类中,您可以提取该角色值并使用它。
我认为它需要一个带有运行时保留的注释,你可以检查运行时是否使用反射存在注释并使用getAnnotation获取注释。 我觉得这比自动扩展所有类要清晰得多。
我相信有一些框架完全使用这样的解决方案,所以应该有一些示例代码。
如果你正在做你正在做的事情,那么继承可能不是正确的习惯用法。 您可能需要考虑装饰器模式,从而构造一个类,该类将其他一些具有较少功能的类作为其参数,并为其添加一些附加功能,将现有类委托给已存在的功能。 如果实现对于许多装饰器是通用的,您可能需要考虑将该功能放在可以共享的类中,以及可以为所有装饰器委派的功能。 根据您的需要,双重调度或反射可能是适当的,以便为各种类制作相似但不完全相同的装饰器。
此外,正如在注释中指出的那样,String被声明为“final”,因此无法扩展。 因此,您应该考虑一个委托/装饰对象的解决方案。 例如,您可能有一些包装字符串的对象,并通过getString()或toString()提供对字符串的访问,但随后在String类之上添加了附加功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.