| |
 | Posted by Commander Zot in reply to forkit | Permalink Reply |
|
Commander Zot 
Posted in reply to forkit
| On Wednesday, 8 June 2022 at 00:12:28 UTC, forkit wrote:
> On Monday, 6 June 2022 at 11:45:31 UTC, Dom Disc wrote:
>> On Monday, 6 June 2022 at 02:35:11 UTC, forkit wrote:
>>> On Monday, 6 June 2022 at 01:23:41 UTC, forkit wrote:
>>>>
>>>
>>> when your boss isn't really your friend:
>>>
>>> // ----
>>>
>>> module test;
>>> @safe :
>>>
>>> class Employee
>>> {
>>> }
>>>
>>> class Boss
>>> {
>>> }
>>>
>> Now that is real nonsense! Why should those two classes ever be within the same file?!?
>>
>
> The two classes were clearly concocted for the example - actually, after a discussion with a friend about problems they were having with their boss - who pretended to be friend to them, until one day ....
>
> But that aside, it is often that one object cannot exist, unless the other object already exists.
>
> It's not unusual, to want to keep this code together - even, god forbid, in the same module!
>
>> Not everything is a friend - only what is in the same file!
>
> Precisely. That's my whole point. Everything in the same file is your friend. Although, that is not the actual problem, since friends are useful. The actual problem is there is 'no option to unfriend'.
>
> There are no encapsulated components in a module. The D language doesn't provide the means to do that. It's all just one big... thing.
interface Foo {
int itWorks();
static Foo _new() {
static class PrivateFoo : Foo {
int _b;
override int itWorks() { return _b; }
}
auto pfoo = new PrivateFoo;
pfoo._b = 42; //only accessible in this function scope
return pfoo;
}
}
int main() {
auto foo = Foo._new;
writeln(foo.itWorks);
return 0;
}
|