2016-04-10 16 views
1

Ich habe eine Klasse A und Factory-Funktionen mit der Methode anwenden.Wiederverwendung Objekt anwenden Funktionen in Scala

Wenn ich eine Unterklasse B von A mit den gleichen Fabrikmethoden habe. Ich habe die gleichen Methoden anwenden, die erzeugt.

Kann ich die Methoden von A in B wiederverwenden?

+0

ist die Signatur der Konstruktoren der Klassen A und B gleich? – Eduardo

+0

@Edurardo: Es ist fast das Gleiche, außer dass ein Parameter in B fehlt, da A den Parameter auf "True" setzt. – prosseek

+0

Wie unterscheiden Sie, wenn Sie eine "A" oder eine "B" -Instanz benötigen? – maasg

Antwort

2

Eine Möglichkeit, dies zu tun, besteht darin, eine Mixin-Eigenschaft zu definieren, die die üblichen Methoden enthält, die von einer abstrakten Factory-Funktion abhängen. Dann können die Begleitobjekte ein solches Mischen erweitern, wobei nur die spezifische Art implementiert wird, um die entsprechende Instanz zu erzeugen.

Ein Beispiel:

trait FooFactory[T] { 
    def make(s:String, i:Int): T 
    def apply(s:String):T = make(s, 0) 
    def apply(i:Int):T = make("", i) 
} 

class A(s:String = "", i:Int = 0) { 
    def foo:String = s+i 
    override def toString() :String = s"[$foo]" 
} 

// object A { 
// def apply(a:String): A = { new A(s=a)} 
// def apply(a:Int): A = { new A(i=a)} 
// } 

object A extends FooFactory[A] { 
    def make(s:String, i:Int) = new A(s,i) 
} 

class B(s:String = "") extends A(s,-1){ 
    override def foo:String = s+":"+super.foo 
} 

// object B { 
// def apply(a:String):B = { new B(a)} 
// def apply(a:Int):B = { new B(a.toString)} 
// } 

object B extends FooFactory[B] { 
    def make(s:String, i:Int) = new B(s) 
} 

Wenn Sie den Zugriff auf bestimmte Methoden der Zielklassenhierarchie benötigen, können Sie den Typ dieser Klasse seiner Subtypen beschränken.

trait FooFactory[T <: A] { 
    def make(s:String, i:Int): T 
    def apply(s:String): T = make(s, 0).someAMethod() 
} 
+0

Danke für Ihre Antwort, ich habe nur hinzugefügt, was für meine Lösung benötigt wurde. Sie können es bearbeiten oder löschen, wenn Sie es nicht mögen. – prosseek

+0

@prossek das ist ungewöhnlich, aber ich mag den kollaborativen Ansatz. Ich habe es einfach an meinen gewohnten Stil angepasst. – maasg