Question

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:

https://stackoverflow.com/questions/21919069/what-version-of-php-allows-type-hints-to-override-typeless-identifiers/

Was it helpful?

Solution

Negative as it goes against polymorphism. Imagine situation:

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

What should happen in this case? The compiler doesn't know that the concrete instance in par only works with SoftScrewdriver. If this is an error, then it can only be checked during runtime and would be problematic for compiled language that focus on catching this kind of errors during compilation. And if you are fine with this error at runtime, then you can simply implement it yourself with simple type checking and conversion. And if you can implement it yourself, there is not big need to extend the compiler.

Licensed under: CC-BY-SA with attribution
scroll top