Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #39712 > unrolled thread

how to add a method specific to builder of specific type only

Started bymike <mikaelpetterson@hotmail.com>
First post2021-11-26 06:15 -0800
Last post2021-11-26 19:13 -0500
Articles 3 — 3 participants

Back to article view | Back to comp.lang.java.programmer


Contents

  how to add a method specific to builder of specific type only mike <mikaelpetterson@hotmail.com> - 2021-11-26 06:15 -0800
    Re: how to add a method specific to builder of specific type only Eric Sosman <esosman@comcast-dot-net.invalid> - 2021-11-26 13:09 -0500
    Re: how to add a method specific to builder of specific type only Arne Vajhøj <arne@vajhoej.dk> - 2021-11-26 19:13 -0500

#39712 — how to add a method specific to builder of specific type only

Frommike <mikaelpetterson@hotmail.com>
Date2021-11-26 06:15 -0800
Subjecthow to add a method specific to builder of specific type only
Message-ID<1b45ddda-a26e-467f-9cfe-0b0d7649a42bn@googlegroups.com>
Hi,

I want to add a method that is specific to DeleteSubtreeBuilder .

SubtreeBuilders.createDeleteSubtree().appendOperation(OperType.DELETE)

I just cannot seem to be able to add:

appendOperation(OperType type) so it only appears in the DeteleSubtreeBuilder that SubtreeBuilders.createDeleteSubtree() returns.

All help appreciated.

br,

//mike

public final class SubtreeBuilders {
 
    public static SubtreeBuilder<DeleteSubtree> createDeleteSubtree() {
        return new DeleteSubtreeBuilder();
    }

  
    public static SubtreeBuilder<SetSubtree> createSetSubtree() {
        return new SetSubtreeBuilder();
    }

static class DeleteSubtreeBuilder extends AbstractSubtreeBuilder<DeleteSubtree>{
    	
        @Override
        protected DeleteSubtree internalBuild() {
            return new DeleteSubtreeImpl(this);
        }
		
    }

}

[toc] | [next] | [standalone]


#39713

FromEric Sosman <esosman@comcast-dot-net.invalid>
Date2021-11-26 13:09 -0500
Message-ID<snr7sk$rgk$1@dont-email.me>
In reply to#39712
On 11/26/2021 9:15 AM, mike wrote:
> 
> I want to add a method that is specific to DeleteSubtreeBuilder .
> 
> SubtreeBuilders.createDeleteSubtree().appendOperation(OperType.DELETE)
> 
> I just cannot seem to be able to add:
> 
> appendOperation(OperType type) so it only appears in the DeteleSubtreeBuilder that SubtreeBuilders.createDeleteSubtree() returns.

     Since createDeleteSubtree() returns a SubtreeBuilder reference, the
only methods callable through that reference are those belonging to (or
inherited by) the SubtreeBuilder class.  Even if the actual instance
returned happens to be a subclass with additional methods, you cannot
use a SubtreeBuilder reference to call them.

     I'm not entirely sure what to suggest, since I'm not entirely sure
I understand what you're trying to do.  One likely possibility, though,
is to change createDeleteSubtree() to return a DeleteSubtreeBuilder
instead of a "vanilla" SubtreeBuilder (assuming DeleteSubtreeBuilder
is a subclass of SubtreeBuilder, which isn't actually spelled out in
the code provided).  If the class relationships aren't as I assume, I'm
afraid I don't know how to help.

> public final class SubtreeBuilders {
>   
>      public static SubtreeBuilder<DeleteSubtree> createDeleteSubtree() {
>          return new DeleteSubtreeBuilder();
>      }
> 
>    
>      public static SubtreeBuilder<SetSubtree> createSetSubtree() {
>          return new SetSubtreeBuilder();
>      }
> 
> static class DeleteSubtreeBuilder extends AbstractSubtreeBuilder<DeleteSubtree>{

     (I'm guessing AbstractSubtreeBuilder is a subclass of SubtreeBuilder
or implements a SubtreeBuilder interface, but I can't be sure.)

>      	
>          @Override
>          protected DeleteSubtree internalBuild() {
>              return new DeleteSubtreeImpl(this);
>          }
> 		
>      }
> 
> }

-- 
esosman@comcast-dot-net.invalid
Look on my code, ye Hackers, and guffaw!

[toc] | [prev] | [next] | [standalone]


#39714

FromArne Vajhøj <arne@vajhoej.dk>
Date2021-11-26 19:13 -0500
Message-ID<61a17823$0$693$14726298@news.sunsite.dk>
In reply to#39712
On 11/26/2021 9:15 AM, mike wrote:
> I want to add a method that is specific to DeleteSubtreeBuilder .
> 
> SubtreeBuilders.createDeleteSubtree().appendOperation(OperType.DELETE)
> 
> I just cannot seem to be able to add:
> 
> appendOperation(OperType type) so it only appears in the DeteleSubtreeBuilder that SubtreeBuilders.createDeleteSubtree() returns.

> public final class SubtreeBuilders {
>   
>      public static SubtreeBuilder<DeleteSubtree> createDeleteSubtree() {
>          return new DeleteSubtreeBuilder();
>      }
> 
>    
>      public static SubtreeBuilder<SetSubtree> createSetSubtree() {
>          return new SetSubtreeBuilder();
>      }
> 
> static class DeleteSubtreeBuilder extends AbstractSubtreeBuilder<DeleteSubtree>{
>      	
>          @Override
>          protected DeleteSubtree internalBuild() {
>              return new DeleteSubtreeImpl(this);
>          }
> 		
>      }
> 
> }

A method needs to be defined in the type returned.

So something like:

package november;

public class BuildFun {
	static interface DeleteSubtree {
	}
	static class DeleteSubtreeImpl implements DeleteSubtree {
	}
	static interface SetSubtree {
	}
	static class SetSubtreeImpl implements SetSubtree {
	}
	static interface SubtreeBuilder<T> {
		public T internalBuild();
	}
	static interface SubtreeBuilderWithAppend<T> extends SubtreeBuilder<T> {
		public SubtreeBuilderWithAppend<T> appendOperation(int op);
	}
	static abstract class AbstractSubtreeBuilder<T> implements 
SubtreeBuilder<T> {
	}
	static abstract class AbstractSubtreeBuilderWithAppend<T> implements 
SubtreeBuilderWithAppend<T> {
	}
	static class DeleteSubtreeBuilder extends 
AbstractSubtreeBuilderWithAppend<DeleteSubtree> {
         @Override
         public DeleteSubtree internalBuild() {
             return new DeleteSubtreeImpl();
         }
         @Override
         public SubtreeBuilderWithAppend<DeleteSubtree> 
appendOperation(int op) {
         	return this;
         }
     }
	static class SetSubtreeBuilder extends AbstractSubtreeBuilder<SetSubtree> {
         @Override
         public SetSubtree internalBuild() {
             return new SetSubtreeImpl();
         }
     }
	static class SubtreeBuilders {
	    public static SubtreeBuilderWithAppend<DeleteSubtree> 
createDeleteSubtree() {
	        return new DeleteSubtreeBuilder();
	    }
	    public static SubtreeBuilder<SetSubtree> createSetSubtree() {
	        return new SetSubtreeBuilder();
	    }
	}
	public static void main(String[] args) {
		SubtreeBuilders.createDeleteSubtree().appendOperation(0).internalBuild();
		SubtreeBuilders.createSetSubtree().internalBuild();
	}
}

Arne

PS: Do you really need such a complex type structure??

[toc] | [prev] | [standalone]


Back to top | Article view | comp.lang.java.programmer


csiph-web