Reputation: 25
I have the following situation and I want to know how I can make the property SomeNumber
to be read only from instances of class A
? BTW, I am using C# latest stable build, or not 7.2 c#, so I can't use private protected
modifier.
So I don't want to be able to set SomeNumber
on accident from class A. I know it can be written in another way to achieve it but can I make the setter in class A
's property only visible to class B
's property setter? So you can still read SomeNumber
from instances of A
. Thanks.
I want to to this because I have multiple classes, not only B
, derived from class A
that hides the base property and they all need to run their own methods when setting SomeNumber
.
class A
{
private int someNumber;
internal int SomeNumber
{
get { return someNumber; }
set
{
someNumber = value;
SomethingNotSpecificForDerivedClasses();//I prefer not to move this to each derived setter! There are more derived classes than just B, fyi
}//I NEED TO MODIFY THE ACCESS OF THIS
}
private void SomethingNotSpecificForDerivedClasses()
{
...
}
}
class B : A
{
new internal int SomeNumber//hides base member
{
get { return base.SomeNumber; }
set
{
base.SomeNumber = value;//ONLY THIS SETTER SHOULD BE ALLOWED TO DO THIS
SomethingINeedToRunWhenSettingSomeNumber();
}
}
private void SomethingINeedToRunWhenSettingSomeNumber()
{
...
}
}
Upvotes: 2
Views: 265
Reputation: 4960
If you want to run a particular method in the setter perhaps you can simply declare a virtual method?
public class A
{
private int _someNumber;
internal int SomeNumber
{
get { return _someNumber; }
set
{
_someNumber = value;
SomethingINeedToRunWhenSettingSomeNumber();
}
}
protected virtual void SomethingINeedToRunWhenSettingSomeNumber()
{
// Do something generic to A.
}
}
public class B : A
{
protected override void SomethingINeedToRunWhenSettingSomeNumber()
{
base.SomethingINeedToRunWhenSettingSomeNumber();
// Do something specific to B.
}
}
Upvotes: 1
Reputation: 2871
Just like with any other override method, you need to make your base class method virtual, and use the 'override' keyword on your subclass.
Within the class, you can then call the base class' method to set the value, so it will run the base-class setter.
Your end result could look like this:
Class A
{
private int someNumber;
internal virtual int SomeNumber
{
get { return someNumber; }
set { someNumber = value; }
}
}
Class B : A
{
internal override int SomeNumber
{
get { return base.SomeNumber; }
set
{
base.someNumber = value;
SomethingINeedToRunWhenSettingSomeNumber();
}
}
private void SomethingINeedToRunWhenSettingSomeNumber()
{
...
}
}
Upvotes: 0