在Android(Xamarin)子类定义中链接构造函数

时间:2017-08-28 18:01:45

标签: android xamarin.android

为了尽量减少重复代码,我想在自定义GridView中使用构造函数链接。

下面的定义在每个构造函数中调用Init()方法:

public class GridView2 : GridView        
{
    //public GridView2(IntPtr jRef, JniHandleOwnership jTransfer) : base(jRef, jTransfer) { }        

    public GridView2(Context context) 
        : base(context)
    {
        Init();
    }

    public GridView2(Context context, IAttributeSet attrs) 
        : base(context, attrs)
    {
        Init(); 
    }

    public GridView2(Context context, IAttributeSet attrs, int defaultStyleAttr) 
        : base(context, attrs, defaultStyleAttr)
    {
        Init(); 
    }

    public GridView2(Context context, IAttributeSet attrs, int defaultStyleAttr, int defStyleRes) 
        : base(context, attrs, defaultStyleAttr, defStyleRes)
    {
        Init();
    }

    private void Init()
    {
        // ...
    }
}

我想通过使用构造函数链来避免这种情况。但是,这样做会导致对API的依赖,我不确定它的便利性是否值得?

此依赖关系发生在

下面的第二个构造函数中
public class GridView2 : GridView        
{
    //public GridView2(IntPtr jRef, JniHandleOwnership jTransfer) : base(jRef, jTransfer) { }        

    public GridView2(Context context) 
        : this(context, null) { }
    // dependency API. defStyleAttr could change
    public GridView2(Context context, IAttributeSet attrs) 
        : this(context, attrs, Android.Resource.Attribute.GridViewStyle) { }
    public GridView2(Context context, IAttributeSet attrs, int defaultStyleAttr) 
        : this(context, attrs, defaultStyleAttr,0) { }
    public GridView2(Context context, IAttributeSet attrs, int defaultStyleAttr, int defStyleRes) 
        : base(context, attrs, defaultStyleAttr, defStyleRes)
    {
        Init();
    }

    private void Init()
    {
        // ...
    }
}

这是由于Android本身如何定义此构造函数

public class GridView extends AbsListView {

    public GridView(Context context) {
        this(context, null);
    }

    // hardcoded value for defStyleAttr
    public GridView(Context context, AttributeSet attrs) {
        this(context, attrs, R.attr.gridViewStyle);
    }

    public GridView(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }

    public GridView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);

        // ...
    }   
}

1 个答案:

答案 0 :(得分:1)

  

我想通过使用构造函数链来避免这种情况。但是,这样做会导致对API的依赖,我不确定它的便利性是否值得?

即使您使用GridView2创建public GridView2(Context context) : base(context)实例也是如此。仍然会应用gridview默认样式,因为this(context, attrs, R.attr.gridViewStyle);由于GridView源代码中的构造函数链而被调用。

所以,你正确地应用了构造函数链。