有没有办法将接口的实现委托给另一个类?

时间:2018-02-07 10:12:10

标签: java android android-fragments

我和Android工作室一直在为Xamarin工作,我决定为朋友创建一个应用程序(这里的完整源代码https://github.com/nekrull/waiter不要过于苛刻请:))

我们的想法是,当出现新屏幕时,会有一个基本活动来交换片段。

片段包含与用户交互有关的所有内容以及它们附加的活动来处理业务逻辑。

要做到这一点,我有一个基类CoreActivity / DataActivity,它有一些大多数片段使用的方法(比如阻止后退按钮)和一些辅助方法(比如调用附加片段上的方法)一个特定的类),CoreInteraction响应此活动和 CoreFragment / AttachedFragment,用作所有视图片段的基础

所以例如视图片段看起来像这样:

public class GroupsFragment extends AttachedFragment<GroupsFragment.GroupsInteraction> {

    //this is what we expect to be able to call in the parent
    public interface GroupsInteraction extends CoreInteraction {
        Group get_shown_group();
        void new_group();
        void select_parent();
    }
}

基本上是一个片段,期望其附加活动能够响应交互方法。

活动片段如下所示:

public class MainActivity extends DataActivity<MainData> implements
    GroupsFragment.GroupsInteraction, (other interactions here) {
}

问题在于,由于我正在处理的应用程序只有一个具有许多小屏幕的Activity,因此基本活动中的代码会变大,这不会导致应用程序或编译或其他任何问题。但这让我很难找到我想要的东西。

我以前在Xamarin做的事情是这样的:

public partial class MainActivity : DataActivity<MainData> {
}

对于初始化活动,然后每个交互都会得到自己的文件:

public partial class MainActivity : GroupsInteraction {
}

它具有相同的效果(因为该类被编译为单个类)但代码将是整洁且易于阅读。

显然Java中没有部分类,但有没有办法将接口的实现委托给另一个类?

当你从界面a调用一个方法时,从某个方面说出&#34;从那个类调用它&#34;没有真正写下像这样的东西:

public Group get_shown_group() {
    return new GroupHandler(this).get_shown_group();
}
public void new_group() {
    new GroupHandler(this).new_group();
}
public void select_parent() {
    new GroupHandler(this).select_parent();
}

提前感谢您提供的任何帮助

2 个答案:

答案 0 :(得分:2)

  

有些说法&#34;当您从界面a调用方法时,从该类调用它&#34;

从字面上理解你所描述的是普通的委托,一个类本身不实现某些功能或任何功能,而是包装实现所需功能的类,调用所述包装类的方法。您甚至可以在运行时切换实现,只需改变包装类(当然,假设类共享一个公共接口)。当然,这不是&#34;备用&#34;你自己写代表团。

class Wrapper implements GroupsInteraction {

    private final GroupInteraction gi;        

    public Wrapper(GroupsInteraction gi) {
      this.gi = gi;
    }

    Group get_shown_group() {
       return this.gi.get_shown_group();
    }

    // ... other interface impls
}

此外,您应该将GroupHandler保留为成员,而不是每次都创建一个新的Object,所以

public Group get_shown_group() {
    return new GroupHandler(this).get_shown_group();
}

变为

public Group get_shown_group() {
    return this.groupHandler.get_shown_group();
}

答案 1 :(得分:1)

您可以尝试委派模式

BaseActivity {

  MyDelegateClass delegate;

    void example() {
        delegate.example();
    }
}

P.S。 activity和delegate都实现了相同的接口

详情here