Ho appena trovato il problema di base in OOP e non riesco a vedere alcuna soluzione funzionante, tranne il rinvio di un controllo appropriato fino al momento dell'esecuzione.
È una nozione abbastanza chiara di un'azione "fare qualcosa con valore dello stesso tipo", indipendentemente dal significato di un determinato linguaggio. Considera Equals
in C # che nella forma più semplice è "questo oggetto è uguale a quell'oggetto". Oppure Comparable<T>
anche in C #. Indipendentemente da dove inizi questa gerarchia, vale quanto segue:
Comparable<T> --> Animal --> Cat
+---> Dog
E il problema:
Animal cat = new Cat();
Animal dog = new Dog();
cat.Compare(dog); // ERR
Come progettare una lingua da zero in questo modo, che la riga precedente darebbe un errore in fase di compilazione?
Finora ho introdotto il tipo Self, che fornisce un chiaro significato a ciò che vorresti fare all'interno di un tipo:
type Animal ... compare(cmp Self) ...
type Cat ... compare(cmp Self) ...
type Dog ... compare(cmp Self) ...
ma non è sufficiente per evitare il problema con oggetti che attraversano il passaggio.
Può essere fatto? Forse era già finito? Come?
Ho già considerato tali misure estreme come due tipi di metodi ereditari - con meccanismo virtuale e non - e li chiamano in modo appropriato, ma questo a sua volta esclude i tipi generici (a meno che i tipi generici non siano implementati come in C ++ - - come modelli). Con solo 2 livelli di ereditarietà si potrebbe fare proibendo l'uso del tipo di livello superiore eccetto per i vincoli generici - ovviamente è troppo limitante.