2012-10-29 12 views
3

我得到了View的子类的几个实例(如ImageView,ViewGroup,TextView等),我让它们都实现了两个方法a()和b(),它们都有运行相同的init()方法,并且对所有这些方法都是相同的。 在这种情况下,我应该如何设计我的架构以增强代码的可重用性?设计问题:增强代码的可重用性的具体情况

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

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

+0

我想创建一个单独的“全局”类,你可以摆在那里方法,将多个activites使用,从需要它们的类调用它们。在每个班级,当你需要它只是调用'Globals.a()' – codeMagic

+1

不能说我同意这种做法。 – AHungerArtist

+0

@codeMagic这是结构化编程,应该避免。 – LuGo

回答

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类实现的方法一起。然后,您可以创建委托方法为exising行为ImageViewViewGroup, 。TextView,等你需要保持不变

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

另外'View'可以被声明为一个接口,它定义了所有视图都应该绑定的合约。 –

+0

@ArunManivannan这是一种可能性,但Android已经有一个'View'类。目前还不清楚OP是在扩展还是从头开始。 –

+0

哎呀。没有注意到“android”标签。对于那个很抱歉。 –

0

你需要一个新的抽象类的init()方法:

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

让你的类(IMA geView,TextView)从这个抽象类继承。

+0

他们不是我的班,ImageView的等内置在Android中,这就是为什么basiclly我没有用这种方法就 –

+0

@OfekRon如果这些类是内置的去的话,你怎么做到:_i把它们都实现两个方法()和b()_ – LuGo

0

如果我正确undestood你的答案,你应该做的是:

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 

    } 

} 
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(); 
} 

,然后再次使用它扩大()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; 

}