1

私のポンプは私の風船を(膨らませる)ことができます。問題ない!しかし、PUMPを使用してBALLOONを(ポップ)しようとすると、実際にはうまく機能しません。PUMPを使い続けることができ、最終的にはバルーンが(ポップ)されますが、腕が本当に疲れているので、今すぐ(ポップ)したいと思います。だから、代わりに、私は私のPOINTY STICKと(ポップ)を手に入れます!もちろん、私のPOINT STICKは、PUMPがそれを(ポップ)するよりも、私のBALLOONを(膨らませる)効果がさらに低くなります。

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

それで、これを達成する方法はありますか?アセンブリを分離しても目的の結果を得ることができません。また、リフレクションとスタックのトレースを使用して検討した他の方法は、デバッグ以外では信頼できません。何をすべきか?!

4

1 に答える 1

0

私の頭に浮かぶ2つの方法:明示的なインターフェースの実装またはイベントを使用します。

明示的なインターフェースを使用すると、インスタンスを「そのまま」脅威にしない人のために実装を非表示にします。例:

    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として脅した場合にのみ表示されます。

于 2012-06-20T03:07:42.443 に答える