Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Inheritance Clojure协议“;继承权不是关于默认实现_Inheritance_Clojure - Fatal编程技术网

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
。您应该看到中的示例。