Android-如何强制孩子覆盖具有代码的父方法 - java

这是场景->假设有3个类,我想做一些类似的事情:

public class GameObject {
    public void updateBounds() {
        // do something
    }
}

public abstract class Enemy extends GameObject {
    public abstract void updatePosition(){ //<-- this will not compile, 
                                    //but this is what i want to do, to force 
                                    //child to override parent method
        updateBounds();
    }

}

public class Minion extends Enemy {
    @Override
    public void updatePosition() {
        super.updatePosition(); // <-- how do i throw an exception if this line
                                // is not called within this method of the
                                // child?
        // now do something extra that only Minion knows how to do
    }
}
  • 您如何设计Enemy类,使其具有可以执行某些操作但需要每个子级都重写它的方法?
  • 您如何强制子级(必须重写该方法)也调用父级的方法?
  • 这几乎就像Android的Activity类,具有onCreate,onStart,onResume ...等。可选的方法,但是如果您使用它,它将强制您调用super。它不能是抽象的,因为我希望在调用该方法时运行某些代码(仅在父类的方法中)。奖励积分,如果您知道他们是怎么做到的?

    参考方案

    Android Sources使用一个称为mCalled的布尔值,该值在准抽象方法实现中设置为true。您的情况将在原始updatePosition()内。

    然后,当您想调用updatePosition()时,可以通过以下方式调用它:

    private void performUpdatePosition() {
        mCalled = false;
        updatePosition();
        if (!mCalled) throw new SuperNotCalledException();
    }
    

    updatePosition()看起来像这样

    protected void updatePosition() {
        mCalled = true;
        updateBounds();
    }
    

    编辑:

    既然我考虑了一下,android的处理方式就差不多了。因为所有对updatePosition()的调用都通过performUpdatePosition()进行,所以您不再需要在updatePosition()中包含可以覆盖但不应覆盖的某些代码。

    更好的方法是将所需的动作简单地移到performUpdatePosition():

    private void performUpdatePosition() {
        updateBounds();
        updatePosition();
    }
    
    protected void updatePosition() {
        //Do nothing by default
    }
    

    这样,被调用者不必担心调用super.updatePosition。如果子类没有重写该函数,则不会发生任何其他事情,而如果子类这样做,则重写将添加到先前的行为上。

    绑定Java库Xamarin.Android - java

    我花了两天时间在每个论坛,文档,tuto,博客等上寻找答案。我为实习生启动了一个Android应用程序,因为我不懂Java,所以用xamarin C#开发了它。直到最近一切都还不错,但现在我需要集成一个SDK才能在应用程序中使用POS(销售点),但是该库是用Java编写的,即使跟随文档或辅导老师,我也无法将其与xamarin绑定(我什至无法调试)。这里有人已…

    在Android中以编程方式从启动器中删除应用程序 - java

    有没有一种方法可以在运行时从家庭启动器中删除活动?我的意思是从其属性或类似内容中删除Intent.CATEGORY_LAUNCHER。 参考方案 您可以通过PackageManager#setComponentEnabledSetting()禁用组件,这将具有将其从启动器中删除的作用。

    是否曾经调用过onUpgrade方法? - java

    是否曾经调用过 onUpgrade 的 SQLiteOpenHelper 方法?如果是这样,什么时候调用它?如果开发人员未调用它,为什么会出现在其中?该功能真正发生了什么?我已经看到了删除所有表的示例,但是有一条评论说删除所有表不是您应该做的。有什么建议? 参考方案 当您构造一个比打开的数据库版本新的SQLiteOpenHelper时,将调用它。做什么取决于…

    为什么我的应用在启动时总是崩溃-Android - java

    刚刚遵循了有关如何制作按钮和活动的youtube指南。我按照他的代码减小字体大小,并且在启动时一直崩溃。有人知道为什么吗?public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { su…

    如何在TabLayout中自定义选定的选项卡指示器? - java

    我想更改带有自定义图标的TabLayout的所选标签指示器,该标签指示器应遵循相同的行为(当用户向下一个标签滑动时,图标将相应移动)。该类中没有默认方法,因为您只能实现选项卡的布局自定义。我决定看一下TabLayout的source code,但1)我无法在类中找到定义制表符指示器绘制时形状的定义的要点,以及2)我找不到甚至完全导入该类。我还希望-如果可能的…