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:



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.

  • I'm sorry, but I forgot to mention that because the parent class does not know how the child classes will implement its methods, parent classes cannot call those methods. A new keyword child would have to be used instead of abstract. – NobleUplift Feb 4 '14 at 15:08
  • @NobleUplift Then that completely removes the need of parent class. If you don't need polymorphism, then extension through composition is much more preferable. – Euphoric Feb 4 '14 at 17:06
  • It turns out that I conflated this issue applied it to OOP, when it was actually a PHP-only issue. I edited my question with a link to the new problem. – NobleUplift Mar 5 '14 at 17:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.