限制成员访问多个特定类

时间:2012-06-20 02:49:31

标签: c# .net oop clr

我的PUMP可以(膨胀)我的BALLOON。没问题!但是当我尝试使用我的PUMP(弹出)BALLOON时,它确实不能很好地工作。我可以继续使用我的PUMP,最终它会(弹出)气球,但我的手臂真的很累,现在我想(弹出)它。所以,相反,我得到了我的POINTY STICK和(pop)!当然,我的POINT STICK在(膨胀)我的BALLOON方面效率甚至低于PUMP(弹出)它的效果。

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!";
        }
    }
}

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

1 个答案:

答案 0 :(得分:0)

我脑海中浮现出两种方式:使用显式接口实现或事件。

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

    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);
    }

请注意,Pump和Pop实现可以标记为私有。它们仅在您将气球分别作为IPumpable或IPoppable威胁时才可见。