discrimination of constructors with same number of parameters

Steven Schveighoffer schveiguy at yahoo.com
Thu Dec 30 07:33:58 PST 2010


On Thu, 30 Dec 2010 05:50:55 -0500, spir <denis.spir at gmail.com> wrote:

> Hello,
>
>
> When 2 constructors (*) accept the same number of parameters, the only  
> remaining discrimination is type. Right? But some language types (or  
> machine types) can have very diverse _human_ semantics, and thus be used  
> for various purposes which should, but cannot, be considered different:
> 	this (int[] data, string filename) {...}
> 	this (int[] data, string message) {...}
> Aliasing like in
> 	alias string Name;
> does not help since for D Name is still string.
>
> I know about typedef, but it is not even mentionned in TDPL, so I guess  
> it is on the deprecation path. (Am I right?) So, what is the solution  
> for this? (I added a 3rd fake bool parameter in one case)

What I would suggest is static factory methods.  The issue with any kind  
of typedef (be it with the soon-to-be-deprecated typedef keyword or with a  
proxy struct), is that what does this mean?

auto obj = new Foo([1, 2, 3], "blah");

Is "blah" a filename or a message?

Whereas, if you use factory methods:

auto obj = Foo.createWithFilename([1,2,3], "blah"); // "blah" is a filename
auto obj = Foo.createWithMessage([1,2,3], "blah"); // "blah" is a message

The code becomes crystal clear.  Reduce verbosity as you see fit ;)

I've used this kind of method with creating exceptions in C#, where I want  
to generate a message based on the data instead of having to redundantly  
specify both the message and the data.

-Steve


More information about the Digitalmars-d-learn mailing list