在android開發過程中,經常會使用builder模式來設置屬性,但是有時候會有存在繼承關係,
用以下方式解決:
1.java雙重繼承 示例
public class AlertDialog extends BaseDialog {
protected BaseBuilder<Builder> mBuilder;
protected void setBuilder(BaseBuilder<Builder> builder){
mBuilder = builder;
}
public abstract static class BaseBuilder<T extends BaseBuilder> {
CharSequence title;
public T title(CharSequence title){
this.title = title;
return (T) this;
}
}
public static class Builder extends BaseBuilder<Builder>{
public AlertDialog build(){
AlertDialog dialog = new AlertDialog();
dialog.setBuilder(this);
return dialog;
}
}
}
public class SubAlertDialog extends BaseDialog {
Builder mBuilder ;
protected void setBuilder(BaseBuilder builder){
super.setBuilder(builder);
mBuilder = (Builder) builder;
}
public static class Builder extends AlertDialog.BaseBuilder<Builder> {
String msg;
public Builder msg( String msg){
this.msg= msg;
return this;
}
public SubAlertDialog build(){
SubAlertDialog dialog = new SubAlertDialog ();
dialog.setBuilder((BaseBuilder)this);
return dialog;
}
}
}
1.kotlin多重繼承示例
父類:
open class ParentDialog : BaseDialogFragment() {
protected var mBuilder: BaseBuilder<Builder>? = null;
internal open fun setBuilder(builder: BaseBuilder<Builder>) {
this.mBuilder = builder;
}
open class BaseBuilder<T : BaseBuilder<T>> {
var title: CharSequence? = null
private set
fun title(title: CharSequence?): T {
this.title = title
return this as T;
}
}
open class Builder : BaseBuilder<Builder>() {
open fun build(): ParentDialog {
var dialog = ParentDialog ();
dialog.setBuilder(this)
return dialog;
}
}
}
子類
open class SubDialog : ParentDialog () {
class Builder : SubDialog <OptionsPickerDialog.Builder>() {
open fun build(): SubDialog {
var dialog = SubDialog ();
dialog.setBuilder(this as BaseBuilder<ParentDialog.Builder>)
return dialog;
}
}
open abstract class SubAbstractBuilder<T : SubAbstractBuilder<T>> :
ParentDialog .BaseBuilder<T>() {
var optionsViewCount: Int = 1
private set
fun optionsViewCount(optionsViewCount: Int): T {
this.optionsViewCount = optionsViewCount
return this as T;
}
}
孫子類:
open class GrandSonDialog : SubDialog () {
open class Builder : GrandSonAbstractBuilder<Builder>() {
open fun build(): GrandSonDialog {
var dialog = GrandSonDialog ();
dialog.setBuilder(this as BaseBuilder<ParentDialog.Builder>)
return dialog
}
}
open abstract class GrandSonAbstractBuilder<T : GrandSonBuilder<T>> :
SubAbstractBuilder<T>() {
var startDate: Date? = null
private set
/**
* 設置起始時間
*/
open fun startDate(startDate: Date?): T {
this.startDate = startDate
return this as T;
}
}
}