8 Temmuz 2015 Çarşamba

TurboTimer (kalıtımla sınıf genişletme)

Merhaba arkadaşlar,

dün bir blogda, timer komponentinin kullanımında, kod içinde timer çalışma durumunun tespiti için, başka bir nesnenin isminin değiştirilerek kullanıldığını gördüm. Kodu aynen almıyorum ancak temel olarak yapılan şuydu;

if (this.Text == "timer is running")
            {
                timer1.Stop();
                this.Text = "timer stopped";
            }
            else
            {
                timer1.Start();
                this.Text = "timer is running";
            }

böyle bir çözüm üretilmesinin sebebi timer nesnesinin çalışma durumunu gösteren belirgin bir property(özellik) olmaması olmalı diye düşünüp, biraz da can sıkıntısından timer'a bir kıyak geçeyim dedim ve timer sınıfından türettiğim TurboTimer sınıfıyla, timera hem bir özellik ekledim hem de çalışma durumu değişikliklerine abonelik yapılsın deyip bir de event handler(olay tutucu) tanımladım. bakın nasıl yapmışım;

//timerstate numaralandırıcısı ile artık intellisense hizmetimizde olacak.
    public enum TimerState { running, stopped }

    public class TurboTimer: System.Windows.Forms.Timer//temel sınıf adına dikkat çünkü frameworkte birden çok timer sınıfı var.
    {
        //özelliğimin varsayılan değerini atıyorum.
        private TimerState currentState = TimerState.stopped;
        public TimerState CurrentState { get { return currentState; } set { currentState = value; } }
        //özellik durum değişikliklerini izlemek isteyen metodlara tutucu tanımlıyorum.        public event EventHandler<TimerStateChangeEventArgs> TimerStateChanged;
        //özelliğimi temel sınıfın enabled özelliğine göre set ediyorum. burada temel sınıfın Enabled özelliğini ezmemiz gerekti.         public override bool Enabled
        {
            get
            {
                return base.Enabled;
            }
            set
            {
                base.Enabled = value;
                this.CurrentState = (base.Enabled) == true ? TimerState.running : TimerState.stopped;
                /*durum değişikliği oluştuğunda abonelere (subscriber) haber vereceğimiz metodu çağırıyorum.
                 * bu sayede aboneler, kendi abonelik metodlarından durumu değerlendirebilecekler.
                 * TimerStateChangeEventArgs sınıfı ile, aboneye, sınıfım içinden istediğim bilgileri gönderiyorum.
                 */
                OnTimerStateChanged(new TimerStateChangeEventArgs(this.CurrentState));
            }
        }
        //öncelikle abonem var mı diye bakıyorum ki işlemci karavana çalışmasın :)        protected virtual void OnTimerStateChanged(TimerStateChangeEventArgs timerStateChangeEventArgs)
        {
            EventHandler<TimerStateChangeEventArgs> handler = TimerStateChanged;
            if (handler != null)
            {
                handler(this, timerStateChangeEventArgs);
            }
        }
    }
    //aboneye göndermek istediğim bilgileri (olay argümanları), EventArgs sınıfından türetilmiş sınıfta belirtiyorum,
    //yukarıda da tetiklemeden önce doldurmuştuk.
    public class TimerStateChangeEventArgs : EventArgs
    {
        public TimerState CurrentState { get; set; }
        public TimerStateChangeEventArgs(TimerState pState)
        {
            this.CurrentState = pState;
        }
    }

TurboTimer sınıfımız Timer komponentinden ve dolayısıyla Component sınıfından türediğinden, kodu derlediğinizde, Tollboxta TurboTimer komponentini göreceksiniz.

 


böylece sınıfımızı toolboxtan sürükleyerek te kullanabileceğiz. 
Esas olarak burada yapılan, bir sınıfa kalıtım yolu ile ek işlevsellikler kazandırmaktır. Yukarıdaki kodları ve, komponenti kullandığım örnek Windows uygulamasını buradan indirebilirsiniz.

Bir sonraki yazımda görüşmek üzere,
Yaşar Şahin

Hiç yorum yok:

Yorum Gönder