protected Access Specifier
The protected access specifier allows class members to be accessed only by those who inherits from them. We learned about the public and private access specifiers. The protected access specifier is used when only the derived classes and the class itself should be able to access the members. Other classes that do not inherit from the class with a protected member will be denied access. The table below shows the accessibility of the three access specifiers.
Accessible from | public | private | protected |
---|---|---|---|
Inside the class | true | true | true |
Outside the class | true | false | false |
Derived class | true | false | true |
Figure 1 – Accessibility of Access Specifiers
You can see that public is the most accessible. Regardless of location, public members and methods can be called or accessed. The private is only accessible inside the class where it belongs. The protected access specifier is accessible inside the class where it is defined and also the derived classes of its class. protected members are prohibited from classes that have no relation. The example code below further shows you their behavior.
using System;
namespace ProtectedAccessSpecifierDemo
{
class Parent
{
protected int protectedMember = 10;
private int privateMember = 10;
public int publicMember = 10;
}
class Child : Parent
{
public Child()
{
protectedMember = 100;
privateMember = 100; // ERROR
publicMember = 100;
}
}
class Program
{
public static void Main()
{
Parent myParent = new Parent();
myParent.protectedMember = 100; // ERROR
myParent.privateMember = 100; // ERROR
myParent.publicMember = 100;
}
}
}
Example 1 – Access Specifiers Demo
Lines 17,28, and 29 will produce an error because they are not allowed to access the protected fields of the Parent class. As you can see in line 17, the Child class is trying to access the private member of Parent. Since private members are inaccessible from the outside, event from derived classes, line 17 will produce an error. If you will notice line 16, the Child class accesses the protected member of the Parent class and it was successful because the Child class is a derived class of the Parent. But if you will look at line 28 where the Program class access the protected member of the Parent class, it produces an error since the Program class does not inherit from the Parent class. Likewise, the Program class cannot also access the private member of the Parent class.