私はその非常に使い方に依存していると思います。 Scalaはマルチパラダイム言語であるため、時には混乱を招くだけでなく、強力になります。 ミックスインは正しい方法で使用すると非常に強力だと思います。 ミックスインを使用して行動を導入し、bolierplateを減らす必要があります。
Scalaの特性は実装を持つことができ、拡張して使用することができます。
形質を継承に使用することができました。私の意見では、mixin
の動作を使用する最善の方法ではありませんが、mixinsと呼ばれることもあります。この場合、特性をJava抽象クラスと考えることができます。スーパークラス(型)の「タイプ」であるサブクラスを取得します。
ただし、形質はproper mixins
としても使用できます。 mixin
としての特性を使用することは、「どのように混ぜるか」という実装に依存します。主にあなた自身に尋ねる簡単な質問です。 「形質のサブクラスは本当に形質のkind
であるか、定型文を減少させる形質行動における振る舞い」である。 通常は、特性を拡張して新しいクラスを作成するのではなく、オブジェクトに特性をミックスすることによって最適に実装されます。例えば
は、次の例を検討:
//All future versions of DAO will extend this
trait AbstractDAO{
def getRecords:String
def updateRecords(records:String):Unit
}
//One concrete version
trait concreteDAO extends AbstractDAO{
override def getRecords={"Here are records"}
override def updateRecords(records:String){
println("Updated "+records)
}
}
//One concrete version
trait concreteDAO1 extends AbstractDAO{
override def getRecords={"Records returned from DAO2"}
override def updateRecords(records:String){
println("Updated via DAO2"+records)
}
}
//This trait just defines dependencies (in this case an instance of AbstractDAO) and defines operations based over that
trait service{
this:AbstractDAO =>
def updateRecordsViaDAO(record:String)={
updateRecords(record)
}
def getRecordsViaDAO={
getRecords
}
}
object DI extends App{
val wiredObject = new service with concreteDAO //injecting concrete DAO to the service and calling methods
wiredObject.updateRecords("RECORD1")
println(wiredObject.getRecords)
val wiredObject1 = new service with concreteDAO1
wiredObject1.updateRecords("RECORD2")
println(wiredObject1.getRecords)
}
concreteDAO
をAbstractDAO
を拡張する形質である - これは、継承
val wiredObject = new service with concreteDAO
ある - サービス形質はのmixin
を義務付けたので、これは適切なミックスインの動作 ですa AbstractDAO
。 service
が要求されているため、AbstractDAO
はAbstractDAO
のタイプではないため、Service
はConcreteDAO
を延長するのは間違いです。 代わりに異なるmixinでservice
のインスタンスを作成します。
Scalaでは、Mixinsは、余分なメソッドで特定の型を飾るきちんとしたコンパイル時変換と考えてください。この場合、Scalaは型チェッカーの "mixed in types"を追跡しますが、メソッド定義自体は実際の型にフラット化されているので、JVMクラス内に親子が設定されていません。継承は、一般に実行時の多型メソッド解決に関連しますが、ミックスインは(ほぼ)直交する概念です。 Java 8のインターフェースデフォルトのメソッドはmixinsです。 – user2864740
この質問は(私はそこの答えで完全に満足しているとは思わないが)[もっと広いコンテキストで前に尋ねられた]ようだ(http://stackoverflow.com/questions/860245/mixin-vs-inheritance)。 – badcook