2011-11-17 6 views
5

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) = ... 

+0

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. –

+0

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. –

+0

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

risposta

0

Benché comprenda i concetti, non so se comprendo pienamente la tua domanda. Vale a dire, sembra che tu stia dicendo che le classi derivate dovrebbero essere in grado di implementare l'override dei metodi che usano parametri che sono "meno" derivati. Sembra indietro per me. Sembra che il metodo prevalente dovrebbe essere in grado di utilizzare "più" tipi derivati. Forse è questo che volevi dire, o forse mi sbaglio su questo, ma qui è una citazione di quello che C# 4.0 consente di:

(Tratto da http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx)

Qual è la varianza per i parametri di tipo generico? Questa è una nuova funzionalità in C# 4.0. Ora, quando si crea un'interfaccia generica, è possibile specificare se esiste una conversione implicita tra istanze di interfaccia che hanno argomenti di tipo diverso. Ad esempio, è possibile utilizzare un'istanza di interfaccia che ha metodi con più tipi di ritorno derivati ​​rispetto a quelli originariamente specificati (covarianza) o che ha metodi con meno tipi di parametri derivati ​​(controvarianza). Le stesse regole sono applicate ai delegati generici.

+1

"Questo mi sembra al contrario" - non lo è, è corretto. Se la funzione 'pippo' nella classe base può accettare qualsiasi stringa, allora l'override' pippo' * deve * come minimo accettare qualsiasi stringa, altrimenti interrompe LSP. Ciò che la contravarianza fa è permettere, in aggiunta, di accettare altre cose. Prendere un super-tipo di String lo fa, permette String e altre cose. È il rovescio della covarianza del tipo restituito, che dice che se una classe base promette di restituire una stringa, allora una classe derivata può essere più specifica su ciò che restituisce e produrre solo alcuni sottotipi di stringa. –

+0

Ah, vedo che non stavo leggendo correttamente la mia quotazione. Vedo che è esattamente quello che dice ora. –

2

(risposta incompleta) Se prendiamo l'esempio di OCaml, risponde al titolo della domanda: si tratta di un "linguaggio di programmazione staticamente tipizzato con ereditarietà in cui i parametri del metodo sono controvarianti".

Per quanto riguarda la seconda parte della domanda ("come risolvono problemi come ..."), il nodo gordiano viene interrotto non consentendo il sovraccarico. (Il sovraccarico significa avere due funzioni con lo stesso nome ma tipi di argomenti diversi, il che rende molto più difficile l'inferenza di tipo).

Problemi correlati