Avrebbe senso aggiungere all'eredità parametri di un tipo dedotto?

0

Scriverò questo in PHP (dove questo pensiero ha avuto origine), ma questo è generico per qualsiasi linguaggio orientato agli oggetti. Fondamentalmente, questa è un'aggiunta alle classi astratte che definisce l'implementazione delle sue sottoclassi. Ovviamente, questo non potrebbe mai entrare nelle interfacce perché definisce come verranno implementate le classi, una contraddizione immediata. Ecco due esempi:

class Boat { }
class RowBoat extends Boat { }
class MotorBoat extends RowBoat { }
class Yacht extends MotorBoat { }

class Screwdriver { }
class SoftScrewdriver extends Screwdriver { }
class PhillipsScrewdriver extends Screwdriver { }

abstract class Parent {
    public child function useScrewdriver(? extends Screwdriver &$screwdriver);

    public child function canOperateSimpleBoat(? super Yacht $yacht);
}
class Child1 extends Parent {
    public function useScrewdriver(SoftScrewdriver &$screwdriver) { }

    public function canOperateSimpleBoat(RowBoat &$rowBoat) { }
}
class Child2 extends Parent {
    public function useScrewdriver(PhillipsScrewdriver &$screwdriver) { }

    public function canOperateSimpleBoat(MotorBoat &$motorBoat) { }
}

Ho usato sintassi dei parametri del tipo limitato Java per rappresentare come funzionavano i metodi astratti . Cosa vedi come i lati positivi e negativi di questo elemento del linguaggio?

EDIT: Si scopre che questo è in realtà un problema esclusivamente PHP che ho cercato di trasformare in un'idea OOP più ampia. L'ho continuato qui:

link

    
posta NobleUplift 30.01.2014 - 19:38
fonte

1 risposta

2

Negativo come va contro il polimorfismo. Immagina la situazione:

Parent par = new Child1()
par.useCrewdriver(new PhillipsScrewdriver())

Cosa dovrebbe accadere in questo caso? Il compilatore non sa che l'istanza concreta in par funziona solo con SoftScrewdriver . Se questo è un errore, allora può essere controllato solo durante il runtime e sarebbe problematico per il linguaggio compilato che si concentra sulla cattura di questo tipo di errori durante la compilazione. E se stai bene con questo errore in fase di esecuzione, puoi semplicemente implementarlo da solo con un semplice controllo e conversione dei tipi. E se puoi implementarlo da solo, non è necessario estendere il compilatore.

    
risposta data 30.01.2014 - 19:47
fonte