dqnqpqv3841 2012-07-24 13:25
浏览 29

too long

Is it a good practice to use in the base class a method which will be defined in a derived one? For instance:

abstract class CApplication {
    use TSingleton;

    protected final function singletonInstanceInit() {
        if (php_sapi_name() == 'cli') {
            $this->initCLIApp();
    }
        else {
            $this->initWebApp();
        }
    }
}

abstract class CWebApplication extends CApplication {   
      protected function initWebApp() { }
}

abstract class CCLIApplication extends CApplication {
    protected function initCLIApp() { }
}
  • 写回答

2条回答 默认 最新

  • drno94939847 2012-07-24 13:28
    关注

    AFAIK this is not a good practice.

    Inheritance is needed for the purpose of defining new behaviors and new specialized types of objects. Which means that you could/*should* write a base class now and extend it some time late on.

    If the base class knows something about the structure of it's derived classes that's somewhat of a contract, the derived classes need to implement some functions in order to work with that base class in which case "design by contract" springs to mind.

    If you need to have a certain function in the derived class maybe it should be declared as an abstract function in the base class or as a method in an interface the class implements.

    That way it's not unreasonable for the base class to know about methods implemented in the derived classes.

    Also AFAIK other stricter languages would not permit this at compiler level. You would really need to do some refactoring to achieve this in c++ or Java something along the lines of what I said above using abstract functions in the base class or interfaces.

    评论

报告相同问题?