How to force derived class to call super method? (Like Android does)

前端 未结 8 2301
余生分开走
余生分开走 2020-12-08 04:00

I was wondering, when creating new Activity classes and then overriding the onCreate() method, in eclipse I always get auto added: super.onCr

8条回答
  •  北荒
    北荒 (楼主)
    2020-12-08 04:30

    To answer your actual question, the auto-creation of the call to super.onCreate() is a feature of the ADT plugin. In java, you cannot directly force a subclass to call the super implementation of a method, afaik (see the pattern described in other answers for work-around). However, keep in mind that in Android, you are not instantiating Activity objects (or Service objects) directly - you pass an Intent to the system and the system instantiates the object and calls onCreate() upon it (along with other lifecycle methods). So the system has a direct object reference to the Activity instance and is able to check (presumably) some Boolean that is set to true in the superclass implementation of onCreate(). Although I don't know exactly how it is implemented, it probably looks something like this:

    class Activity
    {
      onCreate()
      {
        superCalled = true;
        ...
      }
      ...
    }
    

    And in the "system" level class that receives the Intent and instantiates the Activity object from it:

    ...
    SomeActivitySubclass someActivitySubclassObject = new SomeActivitySubclass();
    someActivitySubclassObject.onCreate();
    if (!someActivityObject.isSuperCalled())
    {
      Exception e = new Exception(...) //create an exception with appropriate details
      throw e;
    }
    

    My guess is it's probably slightly more complex than that, but you get the idea. Eclipse automatically creates the call because the ADT plugin tells it to, as a convenience. Happy coding!

提交回复
热议问题