Teoricamente è sana di sostituire i metodi di un genitore in una sottoclasse con un metodo in cui i parametri sono supertipi dei parametri nella classe padre, come:Esistono linguaggi di programmazione con tipizzazione statica con ereditarietà in cui i parametri del metodo sono controvarianti?
class T
def foo(s: String) = ...
class S
override def foo(a: Any) = ...
Quali linguaggi di programmazione supportano questa "funzione" e come fanno a risolvere i problemi come la possibilità che un singolo metodo di una sottoclasse può sovrascrivere diversi metodi di una classe genitore: (. Supponendo che String
e Int
sottotipi di Any
)
class T
def foo(s: String) = ...
def foo(i: Int) = ...
class S
override def foo(a: Any) = ...
Se si parla di lingue tipizzate staticamente di quanto non lo so. Le lingue digitate dinamicamente non si preoccupano di questo problema, quindi presumo che tu stia parlando di lingue tipizzate in modo statico. Si prega di notare nella tua domanda. –
WIkipedia afferma che un linguaggio chiamato "Sather" ha una controvarianza (http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#Sather, http://en.wikipedia.org/wiki/Sather), ma io non può garantire la sua accuratezza. –
non conosco questo linguaggio ma non vedo alcun problema con il fatto che un metodo può sovrascrivere più metodi da super-classe. quando fai 'sInstance.foo (anyObject)' allora viene chiamato questo metodo. non 'T.foo (String)' né 'T.foo (Int)'. Non c'è nessun problema per il compilatore. solo tu, come programmatore, devi progettare le tue classi in modo che questa invocazione abbia senso – piotrek