我有以下情况,我想知道如何才能使SomeNumber
只能从class A
的实例中读取?顺便说一句,我使用的是C#最新的稳定版本,或者不是7.2 c#,所以我不能使用private protected
修饰符。
所以我不希望能够在A级事故中设置SomeNumber
。我知道它可以用其他方式编写来实现它但我可以在class A
'中创建setter s属性只对class B
的属性设置者可见?因此,您仍然可以从SomeNumber
的实例中阅读A
。感谢。
我想这样做,因为我有多个类,不仅B
,派生自class A
隐藏基本属性,他们都需要在设置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()
{
...
}
}
答案 0 :(得分:1)
如果你想在setter中运行一个特定的方法,你可以简单地声明一个虚方法吗?
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.
}
}
答案 1 :(得分:0)
就像使用任何其他覆盖方法一样,您需要使基类方法成为虚拟,并在子类上使用'override'关键字。
在类中,您可以调用基类'方法来设置值,因此它将运行基类设置器。
您的最终结果可能如下所示:
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()
{
...
}
}