【问题标题】:Inheritance question / problem继承问题/问题
【发布时间】:2010-06-05 18:04:32
【问题描述】:

我正在为 android 创建一个自定义布局。 布局实现是完全一样的,但是一次我需要从RelativeLayout扩展,一次从LinearLayout扩展。

class Layout1 extends LinearLayout {
// methods and fields
}

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

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

【问题讨论】:

  • 我认为你不想避免 DRY...
  • @Jason 是的,你是对的

标签: java android oop inheritance


【解决方案1】:

您可以使用组合和类似“策略”模式的东西:

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 类可以同时使用这两种情况。

【讨论】:

  • 如果这对于您的目的来说太复杂了,我建议您实现一个包含所有常见行为的抽象 ViewGroup,然后让您的两个布局使用它们的特定行为扩展抽象 ViewGroup。跨度>
【解决方案2】:

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

我很悲观,因为这些类之间的关系太密切了。

【讨论】:

    【解决方案3】:

    我使用了委托,虽然有些不同。我的班级中唯一的重载方法是一个重载的 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
     }
    

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

    【讨论】:

      猜你喜欢
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      • 2021-07-24
      • 2012-05-11
      相关资源
      最近更新 更多