-3

次のコードでは、からの派生クラスでArrayListメソッド as を使用していOnChanged()ます。

このクラスは次のように宣言されます。 protected virtual void OnChanged(EventArgs e)

質問:保護キーワードと仮想キーワードの背後にある目的は何ですか?

とにかくうまくいきますが、保護されたアクセス修飾子と仮想を使用する背後にある目的を知る必要があります。このコードの最後の 1 つは、ユーザー デリゲートを使用してイベントをキックする方法を教えている MSDN ページからのものです。

using System;

namespace DelegateForEvents
{
    using System.Collections;

    // A delegate type of hooking up change notificatins.
    public delegate void ChangedEventHandler(object sender, EventArgs e);

    // A class that works just like ArrayList, but sends notifications whevern the list changes.
    public class ListWithChangedEvent : ArrayList
    {
        // An event that clients can use to be notified whenever the elements of the list change
        public event ChangedEventHandler Changed;

        // Invoke the Changed event; called whenever list changes 
        protected virtual void OnChanged(EventArgs e)
        {
            if (Changed != null)
                Changed(this, e);
        }


        // Override some of the methods that can change the list;
        // Invoke event after each
        public override int Add(object value)
        {
            int i = base.Add(value);
            OnChanged(EventArgs.Empty);

            return i;
        }

        public override void Clear()
        {
            base.Clear();
            OnChanged(EventArgs.Empty);
        }

        public override object this[int index]
        {
            //get
            //{
            //    return base[index];
            //}
            set
            {
                base[index] = value;
                OnChanged(EventArgs.Empty);
            }
        }
    }
}


namespace TestEvents
{
    using DelegateForEvents;

    class EventListener
    {
        private ListWithChangedEvent List;

        public EventListener(ListWithChangedEvent list)
        {
            List = list;
            // Add "ListChanged" to the Changed event on "List"
            List.Changed += new ChangedEventHandler(ListChanged);
        }

        // This will be called whenever the list changes.
        private void ListChanged(object sender, EventArgs e)
        {
            Console.WriteLine("This is called when the event fires");
        }

        public void Detach()
        {
            // Death the event and delete the list
            List.Changed -= new ChangedEventHandler(ListChanged);
            List = null;
        }
    }

    class Test
    {

        // Test the ListWithChangedEvent class
        static void Main()
        {
            // Create a new list
            ListWithChangedEvent list = new ListWithChangedEvent();

            // Create a class that listens to list's change event
            EventListener listener = new EventListener(list);

            // Add and remove items from the list.
            list.Add("item 1");
            list.Clear();
            listener.Detach();
            Console.ReadLine();

        }
    }
}
4

4 に答える 4

2

Virtual: このメソッドはオーバーライドされることを意図しています。このメソッドを呼び出すときは、IL で「call」ではなく「callvirt」を生成します。

Protected: このメソッドは、このメソッドを継承するクラスに表示されますが、パブリックに呼び出すことはできません。

于 2012-10-10T22:26:21.923 に答える
1

protectedメンバーが宣言されているクラス内、およびこのメンバーを宣言したクラスから派生した任意のクラス内からアクセスできるようにメンバーを定義するアクセス修飾子です。

virtual関数が派生クラスによってオーバーライドできることを示します。これは、それを継承した別のクラスがある場合、そのクラスListWithChangedEventが変更される可能性があることを意味しますOnChanged

于 2012-10-10T22:27:35.513 に答える
1

仮想メソッドは、サブクラスが基本クラスの実装をオーバーライドできることを意味します。virtual キーワードは、基本的にポリモーフィズムを「オン」にします。

Protected は、メソッドが基本クラスと派生クラスからのみアクセスできることを意味します。

于 2012-10-10T22:26:45.137 に答える
1

protectedメソッドは派生クラスで使用できますが、部外者には表示されないことを意味します。private派生クラスを除いて、似たようなものです。

virtualメソッドが呼び出される変数の型に関係なく、常に実際のオブジェクト インスタンスのメソッドが呼び出されることを意味します。

于 2012-10-10T22:26:21.110 に答える