Java 设计问题:增强特定情况下的代码重用性

Java 设计问题:增强特定情况下的代码重用性,java,android,design-patterns,Java,Android,Design Patterns,我有几个视图子类的实例(如ImageView、ViewGroup、TextView等),我让它们都实现了两个方法a()和b(),它们都必须运行相同的init()方法,这个方法很长,对它们都是一样的。 在这种情况下,我应该如何设计我的体系结构来增强代码的可重用性 如果是C++,可以从视图中多继承,在创建时运行一个新的抽象类,并且具有ab方法(a)和(),它是如何在java中实现的?< /p> 也许有什么办法可以通过某种装饰来实现 如果我理解正确,您可以创建一个抽象类AbstractView,该类扩

我有几个视图子类的实例(如ImageView、ViewGroup、TextView等),我让它们都实现了两个方法a()和b(),它们都必须运行相同的init()方法,这个方法很长,对它们都是一样的。 在这种情况下,我应该如何设计我的体系结构来增强代码的可重用性

如果是C++,可以从视图中多继承,在创建时运行一个新的抽象类,并且具有ab方法(a)和(),它是如何在java中实现的?< /p>


也许有什么办法可以通过某种装饰来实现

如果我理解正确,您可以创建一个抽象类
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();
}
由于您试图向一组现有子类(
ImageView
ViewGroup
TextView
等)添加行为,因此可能需要为每个子类(
MyImageView
MyViewGroup
MyTextView
等)创建一个包装器。这些子类中的每一个子类都将扩展
AbstractView
并实现它们自己的
a()
b()
方法,但继承公共
init()
方法(以及
视图
类中实现的所有方法。然后,您可以为
图像视图
视图组
文本视图
等中需要保持不变的现有行为创建委托方法

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
    }
}

您需要使用init()方法创建一个新的抽象类:


让您的类(ImageView、TextView)从这个抽象类继承。

如果我正确地理解了您的答案,您应该做以下操作:

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

    }

}

您可以定义实现方法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;

}

我将创建一个单独的“Globals”类,您可以将多个活动使用的方法放在其中,并从需要它们的类中调用它们。在每个类中,当您需要时,只需调用“Globals.a()“不能说我完全同意这种方法。@codeMagic这是结构化编程,应该避免使用。
视图
也可以声明为定义所有视图都应该绑定到的契约的接口。@ArunManivannan这是可能的,但安卓已经有了一个
视图
类。不清楚操作正在扩展它,或者从头开始。哎哟。没有注意到“android”标记。很抱歉。@OfekRon哦,我没有意识到ImageView、ViewGroup、TextView等都是内置类。@OfekRon看到我的更新了。这很棘手(读“凌乱”)因为你试图在一个超级类和它的子类之间添加新的行为。它们不是我的类,imageview等都是在android中构建的,这就是为什么我没有正确使用这种方法的基本原因away@OfekRon如果这些类是内置的,那么如何实现:我让它们都实现了两个方法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;

}