如何创建扩展类和实现接口的通用java类?

时间:2015-02-27 20:58:59

标签: java android interface type-parameter

我在我的android项目结构中使用DDD,在某些域中,我需要创建一个名为" behavior"将所有屏幕行为放在此文件夹中,如此"公共类profileBehavior {..}"

项目打印:http://tinypic.com/view.php?pic=r1hppi&s=8#.VPDdSlPF_rc

随着时间的推移和改进目标的重用,我正在考虑创建一个" genericBehavior"使用常用方法,例如:

public class GenericBehavior {

private static Context context;
private static View view;

public GenericBehavior(Context context) {
    context = context;
}
public GenericBehavior(View view) {
    view = view;
}

public static GenericBehavior with(final Context context) {


    return new GenericBehavior(context);
}

public GenericBehavior where(final View view) {
    return new GenericBehavior(view);
}

在profileBehavior类中,我希望重用 with where 方法来设置profileBehavior上下文并查看

像:

public class ProfileBehavior extends GenericBehavior {


public ProfileBehavior(Context context) {
    super(context);
}

在profileFragment中我希望使用:

ProfileBehavior
            .with(getActivity())
            .where(rootView)
            .listenAttachOptions()
            .doScrollStuff();

我读到类型参数和接口,但我真的很困惑。在我的情况下,最好是在行为中复制方法还是有解决方案?

2 个答案:

答案 0 :(得分:0)

是的,你可以这样做,虽然你想要修改或追加实例变量而不是替换静态变量,并且返回this而不是新实例或者至少包含旧实例return new GenericBehavior(context, this);的实例。 .. GenericBehavior应该是一个ProfileBehavior实现的接口,所以你可以让ProfileBehavior扩展你想要操作的其他一些类。

答案 1 :(得分:0)

有三种方式(我能想到)这样做:

  1. 通过创建基类(可以是抽象的)并在此基类中实现where()with()并扩展它。
  2. 如果您使用的是Java 8,则会得到default methods(您可以在接口中使用默认的方法实现)
  3. Composition:您可以创建一个实现where()with()(一个行为“基础”对象)的对象,并让“behavior”类的任何其他实例保存一个实例这样的基础对象作为私有成员。每个这样的类都会将每个where()with()调用委托给此基础对象。
  4. #3实施的一个例子:

    class BaseBehavior implement Behavior {
        public Behavior with(final Context context) {
            return new BaseBehavior(context);
        }
    
        public Behavior where(final View view) {
            return new BaseBehavior(view);
        }
    }
    
    class AnotherBehavior implement Behavior {
        BaseBehavior base;    
    
        AnotherBehavior(BaseBehavior base) {
            this.base = base;
        }
    
        public Behavior with(final Context context) {
            return base.with(context);
        }
    
        public Behavior where(final View view) {
            return base.with(view);
        }        
    }
    

    一般来说,组合比继承更受欢迎(因此,如果您不使用Java 8 - 最好使用#3而不是#1),原因很多,如果仅举几例:更容易调试和维护,代码变得不那么分离,并且具有更简单的层次结构,您只能继承(扩展)一个类。