3

View のサブクラス (ImageView、ViewGroup、TextView など) のインスタンスがいくつかあります。これらはすべて a() と b() の 2 つのメソッドを実装しており、同じ init() メソッドを実行する必要がありますが、これは長いものです。そして、それらすべてに対して同じことを行います。その場合、コードの再利用性を高めるためにアーキテクチャをどのように設計すればよいですか?

それが C++ の場合、作成時に init() を実行し、abstarct メソッド a() および b() を持つビューと新しい抽象クラスから多重継承できますが、Java ではどのように達成されますか?

ある種のデコレータを使用してそれを達成する方法があるかもしれませんか?

4

4 に答える 4

1

私があなたを正しく理解していれば、共通メソッド AbstractViewを拡張して実装する抽象クラスを作成できます。抽象メソッドとを宣言する必要がありますが、実装はサブクラスに任せます。Viewinit()AbstractViewa()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のラッパーを作成する必要があります。これらの各サブクラスは、独自のメソッドとメソッドを拡張して実装しますが、(クラスに実装されているすべてのメソッドと共に)共通のメソッドを継承します。その後、必要な、、などの既存の動作のデリゲート メソッドを作成できます。変更しないでください。MyImageViewMyViewGroupMyTextViewAbstractViewa()b()init()ViewImageViewViewGroupTextView

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() 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 に答える
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 に答える