[英]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.