首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Clojure中的抽象函数还是函数接口?

问Clojure中的抽象函数还是函数接口?
EN

Stack Overflow用户
提问于 2010-01-06 15:16:16
回答 1查看 1.2K关注 0票数 9

在很多情况下,我有一系列想要以不同方式实现的函数。最明显的例子是从特定的数据库中抽象出来。在面向对象的语言中,您可以使用一个接口来实现以下功能:

代码语言:javascript
复制
interface DB {
  ResultSet query(String query);
  void persist(Object o);
  ...
}

在speudo代码中,我想要这样做:

代码语言:javascript
复制
(ns dbbackend)

(abstractfn query [q])
(abstractfn persist! [o])

然后是每个数据库的实现:

代码语言:javascript
复制
(ns dbbackend.mysql :implements dbbackend)
(defn query [q] ...)
(defn persist! [o] ...)

我并不完全清楚在函数式语言中执行类似操作的最佳实践是什么,特别是Clojure。我应该为此使用多种方法吗?

EN

回答 1

Stack Overflow用户

发布于 2010-01-06 18:51:58

对于协议前的Clojure版本:

接口:

代码语言:javascript
复制
(ns dbbackend)

(defmulti query
  {:arglists '([c q])}
  suitable-dispatch-fn)

(defmulti persist!
  {:arglists '([c o])}
  suitable-dispatch-fn)

实现:

代码语言:javascript
复制
(ns dbbackend.mysql
  (:requires dbbackend))

(defmethod query com.mysql.jdbc.Connection
  [c q]
  ...)

(defmethod persist! com.mysql.jdbc.Connection
  [c o]
  ...)

用法:

代码语言:javascript
复制
(ns user
  (:require dbbackend dbbackend.mysql))

(def mysql-connection (connect-to-mysql))
(query mysql-connection some-query)

您可以在ClojureQL的幕后找到此方法的真实示例。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2011439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档