たとえば、2つの異なるレコードを持っていても共通のフィールドをいくつか共有している場合は、両方のレコードが共通の基本レコードを共有する方法はありますか?プロトコルはメソッドシグネチャの宣言のみを可能にするようです。Clojureでデータ型の継承を行うことはできますか?
7
A
答えて
3
今は可能ではないと思います。
defrecord
は単なるマクロであり、あなたはそれがmacroexpand
を使って何をするか確認することができ、のようなもの:あなたは、このような記録の継承をしたい場合は
(macroexpand '(defrecord User [Name Age]))
は、だから、おそらくそうするマクロを実装する必要があります。 しかし、継承は私が避けようとしていることは複雑であるため、これを示唆しません。
3
抽象的なプログラミングではなく、特定のフィールドでプログラミングする必要があります。つまり、レコードが共通のインターフェイスを共有できるようにプロトコルを使用する必要があります。たとえば、すべてのレコードタイプが '文字列'プロパティを返す必要がある場合は、 'get-string'メソッドを使用してプロトコルを作成し、それを各レコードタイプに拡張します。
(defprotocol SQL
(get-string [t]))
(defrecord Thing [name f1 f2]
SQL
(get-string [t] (str name)))
(defrecord AnotherThing [name f1 f2 f3 f4 blah]
SQL
(get-string [t] (str name)))
あなた自身が特定のプロトコルの方法ことができます常に「defn-」(非公開機能)実装のための同じ実装を作成し、各レコードタイプでの実装としてそれを使用する見つければ。
+1
別のレコードのいくつかのフィールドを共有するレコードを作成したいのですが?そのような場合:(defrecord a [ba bc])(defrecord b [ba bc bd]。 –
関連する問題
- 1. 継承型で
- 2. MultiLevel継承、クラスCはクラスAを継承できますか?
- 3. この継承をコンポジションに置き換えることはできますか?
- 4. JAVA:ジェネリック型クラスの継承とジェネリック型の継承
- 5. データ継承の継承
- 6. Cでの型キャスティングと継承
- 7. C++で継承階層の一部を隠すことはできますか?
- 8. 1つのIDで継承を作成することはできますか?
- 9. スカラ型クラスと継承でうまく動作しません
- 10. ラスカルの代数データ型の継承?
- 11. のJava型キャストと継承
- 12. Scalaの型パラメータと継承
- 13. クラスが囲むクラスではないというエラーを引き起こす抽象型を継承します
- 14. MVVMモデルを他のモデルから継承することはできますか?
- 15. C#で継承を動的にすることはできますか?
- 16. 誰かがこの継承コードを説明できますか?
- 17. 原型継承
- 18. 継承されたロジックとカスタムロジックを継承したC#継承メソッド - これは可能ですか?
- 19. データのみの継承ですか?
- 20. xmlファイルの属性を継承することはできますか?
- 21. Nhibernateの継承を私に説明することはできますか?
- 22. クラス継承で型が分からないときにどうすればデコードできますか?
- 23. Linq2SQL継承型とOfTypeクエリ
- 24. キャメル型コンバーターとオブジェクト継承
- 25. 角型コントローラ継承とパッシングパラメータ
- 26. C++は継続継承スタイルをどのように使用できますか?
- 27. 峠ジェネリック型まで継承ツリー
- 28. このクラスから継承できますか?
- 29. はRCT_EXPORT_VIEW_PROPERTYを継承できます
- 30. C#ジェネリック型から非ジェネリック型へ継承するとき、どのように冗長性を減らすことができますか?
2つのエンティティがいくつかのフィールドを共有しているということは、それらの間に継承関係を作成するのに十分な理由ではありません。おそらく、いくつかの使用シナリオの例を提供します。 –
たとえば、解析されたSQLクエリを表すためにレコードを使用しています。だから私はSELECT、UPDATE、INSERTなどのレコードを持っています。それらは 'string'プロパティのようないくつかの一般的なプロパティを共有しています。私が多態関数を使ってそれらを扱うとき、私はそれらがすべていくつかの共通の特性を持つことを保証したいと思います。 – Chris
レコードはほんの空想的なマップなので、「すべてのプロパティに共通性があることを確認する」という意味が明確ではありません。なぜ '(:string a-record)'を呼び出せないのですか?また、レコードが持つ可能性のあるキーのセットは、具体的な型が表現できる動作とは異なる問題です。あなたは解決しようとしている実際の問題は何ですか? –