代码之家  ›  专栏  ›  技术社区  ›  Itsik

继承问题

  •  0
  • Itsik  · 技术社区  · 15 年前

    我正在为Android创建自定义布局。 布局实现是完全相同的,但是一旦我需要从relativelayout扩展,并且从linearlayout扩展一次。

    class Layout1 extends LinearLayout {
    // methods and fields
    }
    
    class Layout2 extends RelativeLayout {
    // the same EXACT methods and fields
    }
    

    如何使用继承来避免代码重复并一次性实现我的方法。

    3 回复  |  直到 15 年前
        1
  •  0
  •   Peter Tillemans    15 年前

    我不知道它是否适合您的用例,但是您可以考虑通过添加“其他”类的字段来使用委托。

    不过,我很悲观,因为这些课程关系太密切了。

        2
  •  2
  •   OscarRyz    15 年前

    你可以使用合成和类似“策略”的模式:

    class YourLayout extends ViewGroup {
        ViewGroup strategy;
        public YourLayout( Condition someCondition ) {
           if( someCondition.useLinear() ) {
                strategy = new LinearLayout(); // or Layout1
           } else {
                strategy = new RelativeLayout();
           }
        }
        public View findFocus() {
            return strategy.findFocus();
        }
        .... rest of the methods:
        / rest of specific EXACT methods and fields
     }
    

    你甚至可以改变 strategy 在运行时。

    这样你 YourLayout 类可以同时使用这两种方案。

        3
  •  0
  •   Itsik    15 年前

    我使用了授权,尽管有点不同。类中唯一重载的方法是重载的DispatchDraw。所以我把它移到了一个不同的类中,并在每个扩展的类中包含了它的一个实例。

     class MyLinearLayout extends LinearLayout {
            MyDraw md = new MyDraw();
    
            @Override
            protected void dispatchDraw(Canvas canvas) {    
                md.draw(canvas);
                super.dispatchDraw(canvas);
            }
     }
    
     class MyRelativeLayout extends RelativeLayout {
          //    as above
     }
    

    虽然我还有两个类可以扩展,但是我没有复制之前复制的代码,这正是我想要实现的。