Accessor Accessibility Domain
In couple of interviews the question is asked that can we set different accessors for the same property. So the answer is:
By default these accessors have the same visibility, or access level: for the property or indexer. For more information, see accessibility levels. However, it is sometimes useful to restrict access to one of these accessors. Mostly, for restricting the accessibility of the set accessor, when get accessor is publicly accessible. However, this Restriction is only supported by C# Language. not by VB, or C++ or F# and JScript
Example
The following example contains three classes, MyBaseClass, MyDerivedClass, and MyMainClass. There are two properties in the MyBaseClass, Name and Id on both classes. The example exhibits how the property Id on MyDerivedClass can be hidden by the property Id of MyBaseClass when we use a restrictive access modifier such as protected or private. When we assign values to this property, the property on the MyBaseClass class is called instead. Replacing the access modifier by public will make the property accessible.
The example exhibits how a restrictive access modifier, such as private or protected, on set accessor of Name property in MyDerivedClass prevents access to accessor and generates an error when we assign to it.
////MyBaseClass
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class MyBaseClass
{
private string name = "Name-BaseClass";
private string id = "ID-BaseClass";
public string Name
{
get { return name; }
set { }
}
public string Id
{
get { return id; }
set { }
}
}
}
//MyDerivedClass
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
public class MyDerivedClass : MyBaseClass
{
private string name = "Name-DerivedClass";
private string id = "ID-DerivedClass";
new public string Name
{
get
{
return name;
}
// Using "protected" would make the set accessor not accessible.
set
{
name = value;
}
}
// Using private on the following property hides it in the Main Class.
// Any assignment to the property will use Id in BaseClass.
new private string Id
{
get
{
return id;
}
set
{
id = value;
}
}
}
}
//MyMainClass
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class MyMainClass
{
static void Main()
{
MyBaseClass b1 = new MyBaseClass();
MyDerivedClass d1 = new MyDerivedClass();
b1.Name = "Meetu";
d1.Name = "Gaurav";
b1.Id = "Meet";
d1.Id = "Gaur"; // The BaseClass.Id property is called.
System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
}
/* Output:
Base: Name-BaseClass, ID-BaseClass
Derived: Gaurav, ID-BaseClass
*/
Comments
Notice that if you replace the declaration new private string Id by new public string Id, you get the output:
Name and ID in the base class: Name-BaseClass, ID-BaseClass
Name and ID in the derived class: Gaurav, Gaur