如何从两种可能的替代方案中创建一个已知的类

时间:2015-06-02 07:27:31

标签: java android inheritance casting

我使用两个不同的库来实现相同的功能,可以通过app风格选择。所以我为这两种风格创建了一个接口类:

public class Compat
{
  public static abstract class ActionBar extends android.support.v7.app.ActionBar {}

  public static abstract class FragmentManager extends android.support.v4.app.FragmentManager {}

  public static abstract class ActionBarActivity extends android.support.v7.app.ActionBarActivity
  {
    public FragmentManager getCompatFragmentManager()
    {
      return (FragmentManager) getSupportFragmentManager();  // <-- error
    }

    public ActionBar getSupportActionBar()
    {
      return (ActionBar) super.getSupportActionBar();  // <-- error
    }
  }

  public static class Fragment extends android.support.v4.app.Fragment {}
}

基本上这个课只会创造一堆已知的&#34;这些类只是其真正底层基础的别名。当然,真正的基础基础永远不能在这个类之外导入。所有进一步的代码仅使用这些&#34;已知&#34;从中派生并执行其他操作的类。

稍后在MainActivity.java中:

class MainActivity extends Compat.ActionBarActivity {
  void doSomething()
  {
     Compat.ActionBar ab = getSupportActionBar();
     ...
  }
}

正如您所看到的,如果我希望我的Compat.ActionBarActivity从android.support.v7.app.ActionBarActivity派生一次,而从android.support.v4.app.FragmentActivity派生另一次,我无法在MainActivity.java中包含这两者。我只包含Compat.java并使用那里声明的类。

除了指出的错误的类型转换之外,一切都运行良好。那些抛出异常,如

Caused by: java.lang.ClassCastException: android.support.v4.app.FragmentManagerImpl cannot be cast to com.velis.library.Compat$FragmentManager

当然getSupportFragmentManager并没有返回我的类型的对象,但我确定可以做些什么来实现它?或者,有没有其他方法可以让一个未知的类知道?

编辑:我当前的解决方案(包装类):

import android.support.v4.app.FragmentActivity;

public class Compat
{
  public static class ActionBar
  {
    public android.app.ActionBar a;
    ActionBar(android.app.ActionBar ab) { a = ab; }
  }

  public static abstract class ActionBarActivity extends FragmentActivity
  {
    public android.app.FragmentManager getCompatFragmentManager()
    {
      return getFragmentManager();
    }

    public ActionBar getCompatActionBar()
    {
      return new ActionBar(getActionBar());
    }

    public void supportInvalidateOptionsMenu()
    {
      invalidateOptionsMenu();
    }
  }

  public static class Fragment extends android.app.Fragment {}
}

和MainActivity.java:

public class MainActivity extends Compat.ActionBarActivity
{
....
  public void restoreActionBar()
  {
    Compat.ActionBar actionBar = getCompatActionBar();
    actionBar.a.setNavigationMode(actionBar.a.NAVIGATION_MODE_STANDARD);
    actionBar.a.setDisplayShowTitleEnabled(true);
    actionBar.a.setTitle(mTitle);
  }
....
}

使用该公共成员并不完美,但到目前为止它仍然有效。这个问题是关于如何使这更漂亮。

0 个答案:

没有答案