3

我有一些 View 子类的实例(如 ImageView、ViewGroup、TextView 等),我让它们都实现了两个方法 a() 和 b(),它们都必须运行相同的 init() 方法,该方法很长并为所有这些做同样的事情。在这种情况下,我应该如何设计我的架构以增强代码的可重用性?

如果它是 C++,我可以从视图和一个在创建时运行 init() 并具有抽象方法 a() 和 b() 的新抽象类进行多重继承,它是如何在 Java 中实现的?

也许有某种方法可以使用某种装饰器来实现它?

4

4 回答 4

1

如果我理解正确,您可以创建一个抽象类AbstractView来扩展View和实现您的常用init()方法。 AbstractView应该声明抽象方法a()b(),但将实现留给子类。

public abstract class AbstractView extends View {
    public void init() {
        // common init implementation here
    }

    public abstract void a();
    public abstract void b();
}

由于您试图将行为添加到一组现有子类(ImageViewViewGroupTextView等),您可能确实需要为每个子类(MyImageViewMyViewGroupMyTextView等)创建一个包装器。这些子类中的每一个都将扩展AbstractView和实现它们自己的方法a()和方法,b()但继承公共init()方法(以及类中实现的所有方法。然后,您可以为您需要View的现有行为创建委托方法保持不变。ImageViewViewGroupTextView

public class MyImageView extends AbstractView {

    private ImageView wrappedImageView;

    public MyImageView(Context context) {
        wrappedImageView = new ImageView(context);
    }

    // TODO: Implement other constructor wrappers

    final void clearColorFilter() {
        wrappedImageView.clearColorFilter();
    }

    // TODO: Implement other method wrappers

    @Override
    public void a() {
        // specific implementation here
    }

    @Override
    public void b() {
        // specific implementation here
    }
}
于 2012-10-29T15:38:57.793 回答
0

您需要一个带有 init() 方法的新抽象类:

public abstract class MyAbstractView extends View {
  public void init() {
    //TODO: implement init 
  }
  public abstract void a();
  public abstract void b();
}

让你的类(ImageView、TextView)继承自这个抽象类。

于 2012-10-29T15:39:57.590 回答
0

如果我正确地理解了你的答案,你应该做的是:

public abstract class MyBaseView extends View{

  public MyBaseView(Context context) {
    super(context);
    init();
    // TODO Auto-generated constructor stub
  }


  private void init(){

  }

  public abstract void a();
  public abstract void b();
}

然后使用以下方法再次扩展它:

public class MyView extends MyBaseView{

    public MyView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void a() {
        // TODO Auto-generated method stub

    }

    @Override
    public void b() {
        // TODO Auto-generated method stub

    }

}
于 2012-10-29T15:44:29.970 回答
0

您可以定义实现方法 init() a() b() 的类层次结构。根据层次结构中的子类逐步添加内容。最后,您的视图将调用此类的方法并为自己生成内容。

      interface WidgetContent {
        void init();

        void a();

        void b();
    }

    abstract class AbstractWidgetContent implements WidgetContent  {
        public void init(){}

        public abstract void a();

        public abstract void b();
    }

    class BaseViewWidgetContent extends AbstractWidgetContent {

        public void a() {
        }

        public void b() {
        }

    }

    class ImageViewWidgetContent extends BaseViewWidgetContent {

        public void a() {
        }

        public void b() {
        }
    }

class PictureView extends ImageView{
    ImageViewWidgetContent imageContent;

}
于 2012-10-29T15:50:04.700 回答