Adding a new design constraint to D

forkit forkit at gmail.com
Mon Jun 20 08:25:34 UTC 2022


On Sunday, 19 June 2022 at 22:45:44 UTC, forkit wrote:
>

I'm happy (more than happy actually) to conclude my input into 
this discusssion with this:

D has, by design, rendereed meaningless the concept of a private 
class member (by not even allowing you to declare one as being 
private!).

So, what happens when you do this?

Well, Stroustrup provided some insight into the problem this 
would likely cause.. a looooonnngggg..... time ago...:

(NOTE: below he discusses this in the context of inheritance, not 
modules):

"A member of a derived class has no special permission to access 
private members of its base class ..
This comes as a surprise to some, but consider the alternative: 
that a member function of a derived class could access the 
private members of its base class. The concept of a private 
member would be rendered meaningless by allowing a programmer to 
gain access to the private part of a class simply by deriving a 
new class from it. Furthermore, one could no longer find all uses 
of a private name by looking at the functions declared as members 
and friends of that class. One would have to examine every source 
file of the complete program for derived classes, then examine 
every function of those classes, then find every class derived 
from those classes, etc. This is, at best, tedious and often 
impractical." - Section 12.2.1 - The C++ Programming Language, 
3rd Ed. Stroustrup 1997.

In relation to D, the problem is this:

D does not use friend declarations. In essence, everything 
declared in the module is a friend of any class declared within 
that module.

In D, you have no say in this (i.e. it provides no language 
mechanism to decalre a private member of a class.)

So not only has D rendered meaningless the concept of a private 
class member, it's also makes it impossible to know the friends 
of a class by looking at the
class definition, for its friends.

In essence, you must examine **all** code within a module 
**manually** before you can understand anything about the class.

The class type in D, has been (intentionally!!) morphed into a 
'doWhatEverTheFu#$YouWantWithMe' type.

You can of course cast this 'doWhatEverTheFu#$YouWantWithMe' type 
back into a kinda class type, by putting it in its own module.

Then can be no justification for this. It simply must be fixed, 
before one can take D seriously, as being a language where you 
can do OOP.

The class type is not a type that should be open to this abuse.


More information about the Digitalmars-d mailing list