Per che cosa posso usare il modificatore private final
in Scala per?Uso del modificatore finale privato di Scala?
dato il codice qui sotto:
1| class A { def callFoo = foo; private final def foo = "bar of A" }
2| class B extends A { private final def foo = "bar of B"}
3| println((new A()).callFoo)
4| println((new B()).callFoo)
Linea 3 e 4 stampe:
1| bar of A
2| bar of A
E 'comprensibile il motivo per cui la linea 2 non stampa bar of B
perché ci sono in realtà due foo
definizioni e questi ultimi in B non sovrascrive il primo in A. Altrimenti Scala richiederebbe il override
- invece del modificatore final
.
Quindi perché Scala non ha semplicemente vietato la combinazione dei modificatori private final
?
Non ho pensato all'ambito aggiuntivo che può avere un modificatore. Hai ragione, avendo una definizione privata del pacchetto, 'final' proibisce di sovrascriverlo. In questo caso ha un uso. Ma altrimenti penso che un costrutto linguistico senza un effetto non debba essere legale. Qui, se 'final' non impedisce a sottoclassi o tratti di sovrascrivere una definizione di quella che non deve essere usata in una dichiarazione. –
@Tim il motivo 'finale' non impedisce a sottoclassi/tratti che sovrascrivono la definizione è perché' private' lo ha già impedito. I membri 'private' non sono visibili alle sottoclassi quindi non c'è nulla da sovrascrivere. Affinché questo sia un problema, il programmatore dovrebbe fare due errori distinti: 1) provare a sovrascrivere un metodo privato e 2) dimenticare di usare la parola chiave 'override'. È lo stesso in Java, tranne Java è più soggetto a errori poiché l'annotazione '@ Override' è facoltativa. –