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: