www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to use interface template? How to model interface template properly

reply Matthew Ong <ongbp yahoo.com> writes:
Hi All,

The main aim here is to find out how to model similar syntax within D.

Due to the nature of the architecture of the library that I have 
designed in Java and heavily leans towards interface generics.
It works well with java.

Yes. I am aware about Tuple to allow me to do multiple value return.
The point is Not about returning multiple, but how to moduel

public interface DefType1<T1> { // Please note this is like interface 
template
     public Throwable getError();
     public T1 getValue();
     public String getDesc();
}
// Elsewhere.

public class RetVal1<T1> implements DefType1<T1> {

     private RetVal1() {
     }

     public static <T1> RetVal1<T1> make(T1 value) {
         RetVal1<T1> obj = new RetVal1<T1>();
         obj.mValue = value;
         return obj;
     }

     private Throwable mError;

     public void setError(Throwable error) {
         mError = error;
     }

     public Throwable getError() {
         return mError;
     }
     private T1 mValue;

     public T1 getValue() {
         return mValue;
     }
     private String mDesc;

     public String getDesc() {
         return mDesc;
     }
}

// Yet, else where
class Account{...}

  public static RetVal1<Account> methodA(int num, String str) { // 
similar to Instantiation template
          ... // do something.
         return RetVal2.<Account>make(num, str);
     }

void main(string[] args){
   RetVal1<Account> ret = methodA(1, "abc"); // some method call that return
   if(ret.getError()==null){
      Account acc=ret.getValue1();
      prnln("amount=" + acc.getAmount());
   }
}
http://www.digitalmars.com/d/2.0/template.html#Constraint
Struct, Union, and Interface Templates
...
Analogously to class templates, struct, union and interfaces can be 
transformed into templates by supplying a template parameter list.
However there is no example shown.
In D the syntax should more or less look similar:

interface DefType1(T1) { // No issue here
  	public:
     Throwable getError();
     T1 getValue();
     String getDesc();
}

public class RetVal1(T1) : DefType1(T1) { // ### or IS IT: DefType1!(T1) ??
...
    public static RetVal1(T1) make(T1)(T1 value) { // static method template
         RetVal1(T1) obj = new RetVal1(T1)(); // ### or IS IT: new 
RetVal1!(T1)();
         obj.mValue = value;
         return obj;
    }
...
}


public static RetVal1(Account) methodA(int num, String str) { //### How 
to do that?? Compilation error.
    Account acc=new Account();
    ... // do something.
    return RetVal2.(Account)make(ac); //### How to do that?? compilation 
error also
}

  RetVal1(Account) ret = methodA(1, "abc"); // Compilation error also.
   if(ret.getError()==null){
      Account acc=ret.getValue1();
      prnln("amount=" + acc.getAmount());
   }
------------------------------------------------------------------------
Kindly show some compilable and working code sample.

Thanks very much.

-- 
Matthew Ong
email: ongbp yahoo.com
May 26 2011
parent reply Jacob Carlborg <doob me.com> writes:
On 2011-05-27 07:55, Matthew Ong wrote:
 Hi All,

 The main aim here is to find out how to model similar syntax within D.

 Due to the nature of the architecture of the library that I have
 designed in Java and heavily leans towards interface generics.
 It works well with java.

 Yes. I am aware about Tuple to allow me to do multiple value return.
 The point is Not about returning multiple, but how to moduel

 public interface DefType1<T1> { // Please note this is like interface
 template
 public Throwable getError();
 public T1 getValue();
 public String getDesc();
 }
 // Elsewhere.

 public class RetVal1<T1> implements DefType1<T1> {

 private RetVal1() {
 }

 public static <T1> RetVal1<T1> make(T1 value) {
 RetVal1<T1> obj = new RetVal1<T1>();
 obj.mValue = value;
 return obj;
 }

 private Throwable mError;

 public void setError(Throwable error) {
 mError = error;
 }

 public Throwable getError() {
 return mError;
 }
 private T1 mValue;

 public T1 getValue() {
 return mValue;
 }
 private String mDesc;

 public String getDesc() {
 return mDesc;
 }
 }

 // Yet, else where
 class Account{...}

 public static RetVal1<Account> methodA(int num, String str) { // similar
 to Instantiation template
 ... // do something.
 return RetVal2.<Account>make(num, str);
 }

 void main(string[] args){
 RetVal1<Account> ret = methodA(1, "abc"); // some method call that return
 if(ret.getError()==null){
 Account acc=ret.getValue1();
 prnln("amount=" + acc.getAmount());
 }
 }
 http://www.digitalmars.com/d/2.0/template.html#Constraint
 Struct, Union, and Interface Templates
 ...
 Analogously to class templates, struct, union and interfaces can be
 transformed into templates by supplying a template parameter list.
 However there is no example shown.
 In D the syntax should more or less look similar:

 interface DefType1(T1) { // No issue here
 public:
 Throwable getError();
 T1 getValue();
 String getDesc();
 }

 public class RetVal1(T1) : DefType1(T1) { // ### or IS IT: DefType1!(T1) ??
 ...
 public static RetVal1(T1) make(T1)(T1 value) { // static method template
 RetVal1(T1) obj = new RetVal1(T1)(); // ### or IS IT: new RetVal1!(T1)();
 obj.mValue = value;
 return obj;
 }
 ...
 }


 public static RetVal1(Account) methodA(int num, String str) { //### How
 to do that?? Compilation error.
 Account acc=new Account();
 ... // do something.
 return RetVal2.(Account)make(ac); //### How to do that?? compilation
 error also
 }

 RetVal1(Account) ret = methodA(1, "abc"); // Compilation error also.
 if(ret.getError()==null){
 Account acc=ret.getValue1();
 prnln("amount=" + acc.getAmount());
 }
 ------------------------------------------------------------------------
 Kindly show some compilable and working code sample.

 Thanks very much.

In D the syntax for declaring a template and instantiate a template is not the same. Have a look at the first example of http://www.digitalmars.com/d/2.0/template.htm If don't understand after reading that example please ask again, I don't want to just give away the answer. You'll learn more by reading the documentation and figuring it out by yourself. -- /Jacob Carlborg
May 26 2011
next sibling parent reply Matthew Ong <ongbp yahoo.com> writes:
On 5/27/2011 2:32 PM, Jacob Carlborg wrote:
 On 2011-05-27 07:55, Matthew Ong wrote:

In D the syntax for declaring a template and instantiate a template is not the same. Have a look at the first example of http://www.digitalmars.com/d/2.0/template.htm If don't understand after reading that example please ask again, I don't want to just give away the answer. You'll learn more by reading the documentation and figuring it out by yourself.

 In D the syntax for declaring a template and instantiate a template 

I do understand that declaring is with () and instantiate is !(). That is the reason that I am asking // ### or IS IT: DefType1!(T1) ?? RetVal1(T1) obj = new RetVal1(T1)(); // ### or IS IT: new RetVal1!(T1)(); I read that document. There are little but no practical model. Is there any such syntax being used within the probos lib? -- Matthew Ong email: ongbp yahoo.com
May 26 2011
next sibling parent Matthew Ong <ongbp yahoo.com> writes:
On 5/27/2011 2:48 PM, Matthew Ong wrote:
 On 5/27/2011 2:32 PM, Jacob Carlborg wrote:
 On 2011-05-27 07:55, Matthew Ong wrote:


http://www.dsource.org/projects/tutorials/wiki/InterfaceTemplateExample -- Matthew Ong email: ongbp yahoo.com
May 27 2011
prev sibling parent Matthew Ong <ongbp yahoo.com> writes:
On 5/27/2011 2:48 PM, Matthew Ong wrote:
 On 5/27/2011 2:32 PM, Jacob Carlborg wrote:

-- Matthew Ong email: ongbp yahoo.com
May 27 2011
prev sibling parent Jonathan M Davis <jmdavisProg gmx.com> writes:
On 2011-05-26 23:48, Matthew Ong wrote:
 On 5/27/2011 2:32 PM, Jacob Carlborg wrote:
 On 2011-05-27 07:55, Matthew Ong wrote:
 
 
 In D the syntax for declaring a template and instantiate a template is
 not the same. Have a look at the first example of
 http://www.digitalmars.com/d/2.0/template.htm
 If don't understand after reading that example please ask again, I don't
 want to just give away the answer. You'll learn more by reading the
 documentation and figuring it out by yourself.

Hi Jacob, > In D the syntax for declaring a template and instantiate a template is not the same. I do understand that declaring is with () and instantiate is !(). That is the reason that I am asking // ### or IS IT: DefType1!(T1) ?? RetVal1(T1) obj = new RetVal1(T1)(); // ### or IS IT: new RetVal1!(T1)(); I read that document. There are little but no practical model. Is there any such syntax being used within the probos lib?

struct S(T) { this(T val) { this.val = val; } T val; } auto s = S!(int)(42); or if S were a class auto s = new S!(int)(42); The parens are optional when there's only one template argument, so it could be S!int(42) and new S!int(42) instead. There is no ! in the template definition, but you always use it when instantiating, unless it's inferred (which can be done with functions but not types). e.g. T func(T)(T val) { return val + 2; } auto v = func!int(5); auto w = func(5); assert(v == w); - Jonathan M Davis
May 27 2011