public aliases to private/package symbols
Martin Nowak
dawg at dawgfoto.de
Tue Jan 24 14:00:51 PST 2012
> Yes, because the module cannot transparently change the implementation
> of the aliased types if the template that provided the basis is public.
> (If you ignore error messages.) I think private->public aliases make
> sense and should be allowed.
>
I mostly agree with Jonathan, but that's a good argument.
>> The real problem though is protected->public. That makes it possible
>> for one
>> module to increase the access level of the symbol in another module.
>> That's
>> completely unacceptable IMHO. No module should have control over another
>> module's symbols' access level.
>
> overrides can increase the access level from protected to public,
> therefore I cannot see why aliases should not be allowed to do the same.
>
> (protected is almost as public as public anyway. It is possible to
> create a template that creates a type that behaves like its argument,
> except that it raises the accessibility of all protected members to
> public without using protected->public aliases.)
>
This currently gives me some headache while trying to straighten
protection checks.
It seems to be a special case to make templates more usable as the
instantiation
scope wouldn't actually allow you to access the type.
Without that hole you'd get C++ like shared_ptr with private destructor
errors.
>>
>> So, I definitely think that an alias should not allow a symbol to
>> become _more_
>> accessible.
>>
>
> It has some sane applications and does not compromise information hiding
> features in any way. There is no reason to ban such aliases.
>
>>> http://d.puremagic.com/issues/show_bug.cgi?id=6013
>>
>> Private aliase make a lot of sense to me as long as they actually hide
>> the
>> symbol. That would allow you to rename a symbol internally (e.g. using
>> it to
>> indicate that whenever you use indexOf without fully qualifiying it,
>> you mean
>> the one from std.algorithm, not the one from std.string) without
>> affecting any
>> modules that import that module. However, if it works how private
>> normally
>> works and just affects access level, not visibility, then it's utterly
>> pointless. And unfortunately, at present, that appears to be how it
>> works. So,
>> creating any aliases that aren't public seems like a _bad_ idea to me,
>> since
>> it will needlessly affect other modules. If private actually hid symbols
>> instead of just making them inaccessible though, it would be a
>> completely
>> different story.
>>
>
> It would be great if all private members were invisible to the outside
> world. I don't think the inaccessible/invisible distinction has any
> merits. (except maybe that it simplifies some DMD implementation
> details.)
Yeah, especially sine private imports are already a visibility boundary.
More information about the Digitalmars-d
mailing list