cast(public)
Bill Baxter
wbaxter at gmail.com
Fri Jul 17 12:41:25 PDT 2009
On Fri, Jul 17, 2009 at 12:20 PM, Nick Sabalausky<a at a.a> wrote:
> "dsimcha" <dsimcha at yahoo.com> wrote in message
> news:h3q5td$2jqa$1 at digitalmars.com...
>>I know I've probably mentioned this one here before, but it was buried in
>>long
>> threads.
>>
>> Could we put a feature in the language that allows private member
>> variables to
>> be cast to public? The idea is that, if a class/struct designer makes
>> something private, they're saying it's a bad idea to mess with it, and
>> that
>> you do so at your own risk. However, I think there needs to be a back
>> door to
>> cowboy this one, because otherwise private/protected is just too
>> restrictive
>> for a language like D. It would work something like this:
>>
>> struct Foo {
>> private uint bar;
>> }
>>
>> void main() {
>> Foo foo;
>> foo.bar++; // error
>> (cast(public) foo.bar)++; // Works.
>> }
>
> I don't see a real legitimate point to this. If you need something from a
> module not provided by a public interface (or protected sub-classing) than
> that needs to be properly added to the module's interface. Otherwise you're
> just asking for your code to be broken (in a way that may *or* may not be
> fixable) the moment the module you're hacking into is updated. Why hack it,
> when you could just make a proper added feature? Sure, there may be
> source-not-available stuff, but if you need some extra feature from a
> library that doesn't have source available, and the lib's developers aren't
> receptive to your need, then you're just simply using the wrong library
> anyway.
If you can get the offset of a private member you can always do some
pointer arithmetic to get the offset to the member you want to change.
cast(Thing)(cast(void*)(object) + offsetofPrivateMember);
Or something like that which looks appropriately evil given that
you're doing something you're not supposed to.
I would much rather see variants of cast that guarantee they won't
reinterpret. cast(int)IThoughItWasANumberButItsAnObject. Eek.
--bb
More information about the Digitalmars-d
mailing list