Java Clojure:是否可以继承用:gen class定义的类的状态?

Java Clojure:是否可以继承用:gen class定义的类的状态?,java,oop,clojure,functional-programming,clojure-java-interop,Java,Oop,Clojure,Functional Programming,Clojure Java Interop,我正试图学习一些使用Clojure作为工作语言的Java库。该库(与Java中的通常情况一样)非常面向对象,并且在客户机代码中需要类层次结构。我已经定义了一个从库类继承的类,该类带有一些附加方法,数据存储在状态字段中的可变字典中: (:gen类 :名称my-project.my-parent-class.MyParentClass :扩展com.example.library.LibraryClass :方法[[setSomeData[com.example.library.LibraryTyp

我正试图学习一些使用Clojure作为工作语言的Java库。该库(与Java中的通常情况一样)非常面向对象,并且在客户机代码中需要类层次结构。我已经定义了一个从库类继承的类,该类带有一些附加方法,数据存储在
状态
字段中的可变字典中:

(:gen类
:名称my-project.my-parent-class.MyParentClass
:扩展com.example.library.LibraryClass
:方法[[setSomeData[com.example.library.LibraryType]void]]
:公开方法{libraryMethodOne parentLibraryMethodOne
libraryMethodTwo parentLibraryMethodTwo}
:init init
(国家)
(宏设置字段!
[此关键值]
`(dosync(alter(.state~this)assoc~key~value)))
(1)获取字段
[这把钥匙]
`(@(.state~this)~key))
(defn-init[]
[[]
(参考{:库对象一(LibraryObjectOne.)
:库对象二(LibraryObjectTwo。)})
(defn-setSomeData[此t]
(.setSomething(获取此字段:库对象一)t)
…;(在此重写库方法)
然后,我创建了一个子类,该子类继承自我的
MyParentClass

(:gen类
:名称my-project.my-child-class.ChildClass
:扩展my-project.my-parent-class.MyParentClass
:公开方法{libraryMethodOne myParentClassMethodOne}
:init init
(国家)
(defn-init[]
[[](参考{})])
…
但是,当我在
-setSomeData
方法中为
-ChildClass
实例调用
(get field this:library object one)
宏时,得到一个空指针异常-由
:state
定义的字段没有继承,字典中没有键
:library object one

Quick and dirty fix是子类中的重定义
-init
函数,如下所示:

(defn-init[]
[[](参考{:库对象一(LibraryObjectOne.)
:库对象二(LibraryObjectTwo。)})
(即从父类复制初始化代码)。但这严重违反了干燥原则。有没有从父类继承状态的方法


我知道这根本不是一个惯用的Clojure,是对
:gen类
API的滥用,该类仅用于互操作性目的。也许我不应该使用继承,我必须以某种非面向对象的方式实现多态性(例如,通过修改存储在
状态
字典中的函数和值)。如果这是真的,我在哪里可以看到这种方法的好例子

您不必为子类提供
:state
。如果不这样做,它将只调用父对象的方法

(ns my-project.classes)

(gen-class
  :name my_project.my_parent_class.MyParentClass
  :init init
  :state state)

(defn -init []
      [[]
       (ref {:library-object-one "foo"
             :library-object-two "bar"})])

(gen-class
  :name my_project.my_child_class.ChildClass
  :extends my_project.my_parent_class.MyParentClass)
和调用名称空间:

(ns my-project.core
  (:import (my_project.my_child_class ChildClass))
  (:gen-class))

(defn -main [& args]
  (let [inst (ChildClass.)]
    (println @(.state inst))))
这张照片是:


{:library object one foo,:library object two bar}

从子类的
-init
函数返回
[[](nth(my project.my parent class/-init)1)]
,类似于调用父类构造函数。但这对我来说仍然是个难题。