为了尽量减少重复代码,我想在自定义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);
// ...
}
}
答案 0 :(得分:1)
我想通过使用构造函数链来避免这种情况。但是,这样做会导致对API的依赖,我不确定它的便利性是否值得?
即使您使用GridView2
创建public GridView2(Context context) : base(context)
实例也是如此。仍然会应用gridview默认样式,因为this(context, attrs, R.attr.gridViewStyle);
由于GridView
源代码中的构造函数链而被调用。
所以,你正确地应用了构造函数链。