C# 限制成员对多个特定类的访问

C# 限制成员对多个特定类的访问,c#,.net,oop,clr,C#,.net,Oop,Clr,我的泵可以给气球充气。没问题!但是当我试着用我的泵来打开气球时,它真的不太管用。我可以继续使用我的泵,最终,它会弹出气球,但我的手臂真的很累,我现在想弹出它。所以,相反,我得到了我的尖头棒和弹出!当然,我的点棒对气球的充气效果甚至不如泵对气球的充气效果 Class Balloon { Private int _volume = 0; Private bool _popped = false; Public Balloon() { } //Restrict ca

我的泵可以给气球充气。没问题!但是当我试着用我的泵来打开气球时,它真的不太管用。我可以继续使用我的泵,最终,它会弹出气球,但我的手臂真的很累,我现在想弹出它。所以,相反,我得到了我的尖头棒和弹出!当然,我的点棒对气球的充气效果甚至不如泵对气球的充气效果

Class Balloon
{
    Private int _volume = 0;
    Private bool _popped = false;

    Public Balloon() { }

    //Restrict calling to only a PUMP object
    Internal Inflate()
    {
        if (_popped) return;

        _volume += 1;
        if (volume > 10) this.Pop();
    }

    //Restrict calling to only a POINTY STICK object
    Internal Pop()
    {
        if (!_popped) _popped = true;
    }

    Public string GirlHappiness
    { get
        {
        if (!_popped)
            {
            if (_volume < 3)
                return "......";
            if (_volume < 6)
                return "Ooohhh";                    
            else
                return "Ahhhh! Yay!";
            }
        else
            return "WaAaAaAaHhHhHh";
        }
    }

    Public string BoyHappiness
    { get
        {
        if (!_popped)
            {
            if (_volume < 3)
                return "zzzzzz";
            if (_volume < 6)
                return "zzzzzz";                    
            else
                return "zzzzzz";
            }
        else
            return "Ahahaha YAY!";
        }
    }
}

那么,有没有办法做到这一点?我无法通过分离程序集来实现期望的结果,而我探索的另一种方法,使用反射和跟踪堆栈,在调试之外是不可靠的。怎么办

我想到两种方法:使用显式接口实现或事件

使用显式接口,可以为那些不威胁实例“原样”的人隐藏实现。例如:

    interface IPumpable 
    {
        void Pump();
    }
    interface IPoppable
    {
        void Pop();
    }

    class Balloon :IPumpable, IPoppable
    {
        private void IPumpable.Pump()
        {
            throw new NotImplementedException();
        }   
        private void IPoppable.Pop()
        {
            throw new NotImplementedException();
        }
    }

    public static void PopMethod(IPoppable poppable)
    {
        poppable.Pop();
    }
    public static void PumpMethod(IPumpable pumpable)
    {
        pumpable.Pump();
    }

    static void Main(string[] args)
    {
        Balloon balloon = new Balloon();

        PumpMethod((IPumpable)balloon);
        PopMethod((IPoppable)balloon);
    }
请注意,泵和Pop实现可以标记为私有。它们仅在您分别威胁气球为IPumpable或IPoppable时可见