たとえば、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. データ継承の継承
- 5. Cでの型キャスティングと継承
- 6. のJava型キャストと継承
- 7. MVVMモデルを他のモデルから継承することはできますか?
- 8. 原型継承
- 9. C#で継承を動的にすることはできますか?
- 10. データのみの継承ですか?
- 11. キャメル型コンバーターとオブジェクト継承
- 12. Linq2SQL継承型とOfTypeクエリ
- 13. Nhibernateの継承を私に説明することはできますか?
- 14. xmlファイルの属性を継承することはできますか?
- 15. C#でのデータ継承
- 16. C++は継続継承スタイルをどのように使用できますか?
- 17. このクラスから継承できますか?
- 18. javascript Functionオブジェクトから継承することはできますか?
- 19. コードファーストでカスタムタイプのプロパティを継承することはできません
- 20. 、私が原型継承をしようとしています
- 21. カスタムフィールド型継承PropertySchema
- 22. 多型対継承
- 23. クラスを複数のファイルに分割するだけで継承を使うことはできますか?
- 24. 単一のテーブル継承エンティティがクラステーブル継承エンティティを拡張できますか?
- 25. 継承階層のクラスの汎用メンバに型制約を課すことは可能でしょうか?
- 26. 継承されたプロパティの型を継承型に変更する
- 27. Script#では、どのようにして継承するリストを列挙できますか?この例では
- 28. JSF 2:@ManagedBeanを継承することは可能ですか?
- 29. 未知の継承型のシリアライズとデシリアライズ
- 30. クラスから継承したクラスとDelphiのインターフェイスから継承するクラスを作成できますか?
2つのエンティティがいくつかのフィールドを共有しているということは、それらの間に継承関係を作成するのに十分な理由ではありません。おそらく、いくつかの使用シナリオの例を提供します。 –
たとえば、解析されたSQLクエリを表すためにレコードを使用しています。だから私はSELECT、UPDATE、INSERTなどのレコードを持っています。それらは 'string'プロパティのようないくつかの一般的なプロパティを共有しています。私が多態関数を使ってそれらを扱うとき、私はそれらがすべていくつかの共通の特性を持つことを保証したいと思います。 – Chris
レコードはほんの空想的なマップなので、「すべてのプロパティに共通性があることを確認する」という意味が明確ではありません。なぜ '(:string a-record)'を呼び出せないのですか?また、レコードが持つ可能性のあるキーのセットは、具体的な型が表現できる動作とは異なる問題です。あなたは解決しようとしている実際の問題は何ですか? –