Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

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:

share|improve this question
up vote 2 down vote accepted

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.

share|improve this answer
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 posting your answer, you agree to the privacy policy and terms of service.

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