Class views - a new concept

Dom Disc dominikus at scherkl.de
Mon Jun 27 12:00:58 UTC 2022


On Sunday, 26 June 2022 at 23:33:42 UTC, forkit wrote:
> So I came up with this idea, based on discussion in another, 
> rather controverial, thread ;-)
>
> In any case, I think this idea deserves it's own thread.
>
> NOTE::it's just an idea, and certainly **not** a proposal.
>
> I'd be interested to know, if anyone else out there knows of 
> any langauge, where a concept like this has been implemented 
> (i.e. a way to restrict specific class member functions to 
> specific class variables).
>
> So...here I introduce a new concept, which (for now), we'll 
> call a 'view'.
>
> It can solve multiple problems, at least for me.
>
> First, it eliminates a need for that very controversial idea of 
> 'private(this)'
>
> Second, it allows fine grained control of member access, to 
> member variables.
>
> Anything declared private, in a view, is simply private to that 
> view.
>
> Destroy! (but try to be civil too)
>
>
> class myClass
> {
>     @view
>     {
>         private:
>           int x;
>
>     	public:
>           void setX(int x) { this.x = x; }
>           int getX( return this.x; }
>     }
>
>
>     private:
>       void fred() { this.x = -1; }  // error: fred is not part 
> of the view that contains x
>       int waldo() { return this.x; } // error: waldo is not 
> part of the view that contains x
>
>     public:
>       void foo() { this.x = -1; }  // error: foo is not part of 
> the view that contains x
>       int bar() { return this.x; } // error: bar is not part of 
> the view that contains x
> }

What I don't like about this, is that free functions 
(non-members) can not be part of a @view. Also, this is nothing 
new. Instead of a @view you can simply use a subclass with static 
members (so that you don't need an instance of the subclass) and 
reach the same effect.

What part of "@hidden var" paired with "@sees(var) fun(){ }" 
don't you like? It provides the same features without needing 
extra scopes and also allow non-menbers to access @hidden vars if 
explicitly annotated.
Also it allows more fine-grained control:

class C
{
    @hidden int x, y;

    @sees(x) void funA(int v)
    {
       x = v;
       y = 0; // error, no access
    }

    @sees(x, y) void funB(ref int z)
    {
       int t = x;
       x = y; // ok
       y = z; // ok
       z = t;
    }
}

@sees(y) int funC() // a friend, because it's in the same module
{
    y = x; // error, no access to x, not even for reading
    return y; // ok
}




More information about the Digitalmars-d mailing list