Named constructors

Arafel er.krali at gmail.com
Sat Nov 9 12:35:47 UTC 2024


On 9/11/24 1:02, JN wrote:
> ```d
> class Angle
> {
>      float radians;
> 
>      this.fromRadians(float rad) : radians(rad) { }
>      this.fromDegrees(float degs) : radians(degs * (PI / 180.0f)) {}
> }
> 
> Angle a1 = new Angle.fromRadians(PI / 2.0f);
> Angle a2 = new Angle.fromDegrees(90.0f);
> ```

This would interfere with, and can be simulated through, nested classes:

```d
enum PI=3.141592f;

class Angle
{
     float radians;
     this(float rad) { radians = rad; }
     static class FromRadians : Angle {
         this(float rad) { super(rad); }
     }
     static class FromDegrees : Angle {
         this(float degs) { super(degs * (PI / 180.0f)); }
     }
}

void main() {
	Angle a1 = new Angle.FromRadians(PI / 2.0f);
	Angle a2 = new Angle.FromDegrees(90.0f);
}
```

If you don't want to allow direct instantiations of `Angle`, you can 
declare it `abstract`, or disable its constructor.


More information about the dip.ideas mailing list