【问题标题】:Java Inheritance - sibling's overriding method issuesJava继承-兄弟的覆盖方法问题
【发布时间】:2016-03-16 21:20:49
【问题描述】:

我有 4 个类,1 个父类和 2 个继承子类(兄弟姐妹),以及一个接口(服务回调,每组时间(例如每 5 秒)执行一次操作,顺便说一下,这是从 Android 开发完成的。

我把除去接口的3个类贴出来减少一些代码

父类 BaseActivity.java

 public class BaseActivity extends Activity implements BackgroundServiceCallback{

     @Override
     public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);
         BaseActivity.this.startBackgroundService();
     }

     @Override
     public void onBackgroundServiceCallback() {
         // no concrete implementation (will be implemented in child_a)
     }

     public void startBackgroundService() {
         // configure and start the service here
     }
}

继承的 Child,ChildActivity_A.java

  public class ChildActivity_A extends BaseActivity {

     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         // some activity configurations here.
     }

     @Override
     public void onBackgroundServiceCallback() {
         // concrete implementation goes here, and will work
     }
 }

正如您在上面看到的(无论后台服务在做什么)Child_A 的具体方法(每次回调发生时都会执行

现在这是变得棘手的地方(在我看来) 这是第三节课

继承子 ChildActivity_B.java

  public class ChildActivity_B extends BaseActivity {

     @Override
     public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);
         // some activity configurations here.

         // if I call super.startBackgroundService() or this.startBackgroundService
         // ChildActivity_A's implementation is not being called
     }
 }

如果我从 ChildActivity_B 调用 startBackgroundService,则不会调用 ChildActivity_A 上的具体实现

在 android 开发之前,我一直在做 java 程序,认​​为事情是理所当然的,我想我错过了一些关于继承的事情,这让我在这种情况下感到困惑。

我只需要一些关于为什么会发生的启发,(顺便说一下,我通过在自定义应用程序类中设置静态标志来启动服务或不在活动中解决真正的问题)

【问题讨论】:

  • 我在这里错过了一个测试,我尝试在 ChildActivity_A 上调用 super.startBackgroundService(),并且覆盖的方法有效。现在这就是我所理解的.. 有什么叫做 “隐式方法覆盖?” 这就是为什么当我在 ChildActivity_B上调用 super.startBackgroundService() 时>, onBackgroundServiceCallback()ChildActivity_A 的 实现 NOT 被调用,因为在 ChildActivity_B 中存在**“IMPLICIT”** 或隐藏覆盖?

标签: java android inheritance interface overriding


【解决方案1】:

在您的代码中"BaseActivity.this.startBackgroundService()" 实际上是启动后台服务,在BaseActivity.java 中可用。在您的ChildActivity_B 中,您通过super.onCreate(savedInstanceState); 调用它。所以它只会调用它的超级方法,它在它的超级类BaseActivity.java中可用,而不是ChildActivity_AChildActivity_B实际上对ChildActivity_A一无所知。

【讨论】:

  • “ChildActivity_B 实际上对 ChildActivity_A 一无所知”——你给了我提示
  • 如果它对您有任何帮助,那就太好了。
  • 等等我在上面添加了评论,我真的想证明我的理解是正确的。是否存在隐式覆盖?
  • @zabdiel 没有隐式方法覆盖。覆盖总是显式。此外:一个类只是从其父类继承非私有方法。兄弟类之间没有覆盖或继承关系。
猜你喜欢
  • 1970-01-01
  • 2020-07-07
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 2013-08-13
  • 2015-08-28
相关资源
最近更新 更多