java和kotlin的Builder模式的繼承

在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;
        }
       }

 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章