Verschil tussen abstracte klasse en eigenschap

Mogelijk duplicaat:
Scala-kenmerken versus abstracte klassen

Wat is het conceptuele verschil tussen abstracte klassen en eigenschappen?


Antwoord 1, autoriteit 100%

Een klasse kan slechts één superklasse uitbreiden, en dus slechts één abstracte klasse. Als je meerdere klassen wilt samenstellen, is de Scala-manier om mixin-klassencompositiete gebruiken: je combineert een (optionele) superklasse, je eigen liddefinities en een of meer eigenschappen. Een eigenschap is beperkt in vergelijking met klassen omdat het geen constructorparameters kan hebben (vergelijk de scala-referentiehandleiding).

De beperkingen van eigenschappen in vergelijking met klassen zijn ingevoerd om typische problemen met meervoudige overerving te voorkomen. Er zijn min of meer gecompliceerde regels met betrekking tot de overervingshiërarchie; het is misschien het beste om een ​​hiërarchie te vermijden waar dit er echt toe doet. 😉 Voor zover ik begrijp, kan het alleen uitmaken of je twee methoden met dezelfde handtekening / twee variabelen met dezelfde naam van twee verschillende eigenschappen erft.


Antwoord 2, autoriteit 75%

Een aspect van eigenschappen is dat ze stapelbaarzijn. Een beperkte vorm van AOP toestaan ​​(rond advies).

trait A{
    def a = 1
}
trait X extends A{
    override def a = {
        println("X")
        super.a
    }
}  
trait Y extends A{
    override def a = {
        println("Y")
        super.a
    }
}
scala> val xy = new AnyRef with X with Y
xy: java.lang.Object with X with Y = $anon$1@6e9b6a
scala> xy.a
Y
X
res0: Int = 1
scala> val yx = new AnyRef with Y with X
yx: java.lang.Object with Y with X = $anon$1@188c838
scala> yx.a
X
Y
res1: Int = 1

De resolutie van superweerspiegelt de linearisatie van de overervingshiërarchie.


Antwoord 3, autoriteit 21%

Conceptueel is een eigenschap een onderdeel van een klasse, niet een klasse op zich. Als zodanig heeft het meestal geen constructors en is het niet bedoeld om “op zichzelf te staan”.

Ik raad aan om een ​​abstracte klasse te gebruiken als deze een onafhankelijke betekenis heeft, en traits als je alleen functionaliteit op een objectgeoriënteerde manier wilt toevoegen. Als je niet zeker weet tussen de twee, zou je kunnen ontdekken dat als al je methoden om één ding draaien, je waarschijnlijk een eigenschap wilt.

Voor een (niet-taalspecifiek) voorbeeld, als uw werknemer zowel “Persoon” als “Kloonbaar” moet uitbreiden, maak dan Persoon een basisklasse en Kloonbaar een eigenschap.


Antwoord 4, autoriteit 7%

Tenminste in Scala heeft het traits-systeem een ​​expliciete manier om ouderprioriteit in een subklasse te declareren om typische problemen te voorkomen die verband houden met meervoudige overerving, d.w.z. conflicten met overgeërfde methoden met dezelfde handtekening.

Kenmerken zijn verwant aan Java-interfaces, maar mogen methode-implementaties hebben.

Other episodes