Inheritance Clojure协议“;继承权不是关于默认实现
我有协议Inheritance Clojure协议“;继承权不是关于默认实现,inheritance,clojure,Inheritance,Clojure,我有协议A。我想创建一个协议B,这样用B扩展一个类型就会迫使程序员为a的所有成员函数提供实现 当然,这只是核心Java中的接口继承 我见过这种合成方法。问题是名称空间被屏蔽了。如果A在命名空间c.A中,则所有方法都在该命名空间中定义。使用组合,在命名空间c.B中定义B的方法 据推测,命名空间c.b需要命名空间c.a。因此,这些方法的变量在B的定义上被遮蔽了 如果存在从a继承的另一个协议C,这将成为一个问题。当lib客户端名称空间中同时需要c.b和c.c两个名称空间时,会发生什么情况?其中一组方法
A
。我想创建一个协议B
,这样用B
扩展一个类型就会迫使程序员为a
的所有成员函数提供实现
当然,这只是核心Java中的接口继承
我见过这种合成方法。问题是名称空间被屏蔽了。如果A
在命名空间c.A
中,则所有方法都在该命名空间中定义。使用组合,在命名空间c.B
中定义B
的方法
据推测,命名空间c.b
需要命名空间c.a
。因此,这些方法的变量在B
的定义上被遮蔽了
如果存在从a
继承的另一个协议C
,这将成为一个问题。当lib客户端名称空间中同时需要c.b
和c.c
两个名称空间时,会发生什么情况?其中一组方法变量掩盖了另一组方法变量,而获胜的方法变量集不适用于满足失败协议的类型
除了编写我自己的协议定义宏和扩展宏之外,我将如何解决这个问题?Clojure协议并不是设计用来解决这个问题的。如有必要,该类型应显式扩展这两个协议。我认为这是有意义的,因为调用方需要显式地指定每个成员函数的名称空间。例如,由于人们会调用(动物/睡眠)而不是(狗/睡眠)或(猫/睡眠),因此应该将动物和狗(而不仅仅是狗)解除类型化或具体化。如果不可能,那就不可能。我希望您了解这对框架作者的敌意。如果我希望我的用户使用我的框架编写他们自己的库,并且他们的库的用户需要显式地使用框架核心协议进行扩展,那么这不是一个真正的黑盒抽象,是吗?也许里奇·希基认为这种生态系统很糟糕。在任何情况下,require都不会照你说的做,对吗?如果cat ns需要动物ns,则cat/sleep应起作用。当我使用键盘时,我需要检查一下。编写自己的协议和扩展宏是一门合法的课程。否则,也许您可以描述您正试图实现什么,而不是如何实现。clojure协议与java接口不完全相同,也与继承无关。如果要模拟继承,可以使用
makehierarchy/derivate
。如果要使用Java继承,可以使用definterface/deftype/defred
。如果要烘焙自己的分派,可以使用defmulti/defmethod
。您应该看到中的示例。