I'll write this in PHP (where this thought originated), but this is generic to any object-orientated language. Basically, this is an addition to abstract classes that defines the implementation of its subclasses. Obviously, this could never go into interfaces because it defines how classes will be implemented, an immediate contradiction. Here are two examples:
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) { }
}
I used Java bounded type parameter syntax to represent how the abstract methods would work. What do you see as the positives and negatives of this language element?
EDIT: It turns out that this is actually a solely PHP issue that I tried to make into a larger OOP idea. I've continued it here: