Thread overview
cannot I override and mark it as private?
May 12, 2021
Jack
May 12, 2021
Imperatorn
May 12, 2021
Basile B.
May 12, 2021

I'd to change the visibility of a method overrided from public to private but it doesn't work tho to protected it does. Why is that?

give:

class A
{
    void f() { }
}

this is ok:

class B : A
{
    protected override void f() { }
}

this is not:

class B : A
{
    private override void f() { }
}

Why is that? why must I leave it accessible somehow (even if it's protected) to all derived class of my derived class?

May 12, 2021

On Wednesday, 12 May 2021 at 19:35:31 UTC, Jack wrote:

>

I'd to change the visibility of a method overrided from public to private but it doesn't work tho to protected it does. Why is that?

give:

class A
{
    void f() { }
}

this is ok:

class B : A
{
    protected override void f() { }
}

this is not:

class B : A
{
    private override void f() { }
}

Why is that? why must I leave it accessible somehow (even if it's protected) to all derived class of my derived class?

Can you begin protected instead? 🤔

May 12, 2021

On Wednesday, 12 May 2021 at 19:35:31 UTC, Jack wrote:

>

I'd to change the visibility of a method overrided from public to private but it doesn't work tho to protected it does. Why is that?
...
Why is that? why must I leave it accessible somehow (even if it's protected) to all derived class of my derived class?

See specs : https://dlang.org/spec/attribute.html#visibility_attributes

>

Symbols with private visibility can only be accessed from within the same module. Private member functions are implicitly final and cannot be overridden.

May 12, 2021
On 5/12/21 5:55 PM, Basile B. wrote:
> On Wednesday, 12 May 2021 at 19:35:31 UTC, Jack wrote:
>> I'd to change the visibility of a method overrided from public to private but it doesn't work tho to protected it does. Why is that?
>> ...
>> Why is that? why must I leave it accessible somehow (even if it's protected) to all derived class of my derived class?
> 
> See specs : https://dlang.org/spec/attribute.html#visibility_attributes
> 
>> Symbols with private visibility can only be accessed from within the same module. Private member functions are implicitly final and cannot be overridden.
> 
> 

This is (slightly) different, as he's not overriding private member functions. He's overriding public functions, and marking them as private.

I think the issue is more that private functions are not allowed to be in the vtable (which is not exactly what the text says).

Besides, it would be weird to mark a public function private in a derived type. All that is required is to cast to the base class and then you can call it.

I swear I read a bug that discusses this exact issue...

-Steve