Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Inconsistent accessibility with abstract classes

I have an internal abstract class InternalClassBase and two (also internal) classes InternalClass1 and InternalClass2, which inherit from InternalClassBase.

I also have a public abstract class PublicClassBase and two (also public) classes PublicClass1 and PublicClass2, which inherit from PublicClassBase.

The PublicClassBase has a protected member XXX of type InternalClassBase, so both PublicClass1 and PublicClass2 can use it.

This is my code:

internal abstract class InternalClassBase { }
internal class InternalClass1 : InternalClassBase { }
internal class InternalClass2 : InternalClassBase { }

public abstract class PublicClassBase
{
    protected InternalClassBase XXX;  // this is where the error happens
}
public class PublicClass1 : PublicClassBase { }
public class PublicClass2 : PublicClassBase { }

Why can't PublicClassBase contain the XXX member in my example? I thought that XXX would only be visible within PublicClassBase, PublicClass1 and PublicClass2, but not outside of it.

I also thought that I understand access modifiers, but obviously I don't :)

Edit - the error happens at declaration of XXX inside PublicClassBase, and the exception message is: Inconsistent accessibility: field type 'ClassLibrary2.InternalClassBase' is less accessible than field 'ClassLibrary2.PublicClassBase.XXX', but how can protected be more accessible then internal?

like image 819
sventevit Avatar asked Dec 26 '22 19:12

sventevit


1 Answers

Imagine that in an assembly other than the one types from your example are declared, you declare class PublicClass3 that inherits from PublicClassBase. The field XXX should be visible from PublicClass3, since it is protected, but the type of the field is internal, so at the same time, it should not be visible from PublicClass3.

Obviously, you cannot have both, hence the error.

You can solve this either by making your field private, or making PublicClassBase and its children internal.

like image 73
Nikola Anusev Avatar answered Jan 20 '23 07:01

Nikola Anusev