如何在基类中创建隐藏属性仅获取

时间:2017-12-07 19:47:07

标签: c# .net inheritance

我有以下情况,我想知道如何才能使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()
    {
        ...
    }
}

2 个答案:

答案 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()
    {
        ...
    }
}