25 Ağustos 2015

Interface 4 :Reimplementing an Interface in a Subclass

using System;

namespace Interface3
{
    class Program
    {
        /*
         Bir altsinif(subclass) taban sinifinda(base class) uygulamış olan interface elemanına tekrar uygulanabilir.
         * Yeniden uygulanmada virtual yazmazsak intefacemizi tekrar belirtmemiz gerekir
         * Bu durumda
         */
        public interface IUndoable { void Undo();}
        public class TextBox : IUndoable
        {
            void IUndoable.Undo()//IUndoable.Undo yazdığımız için bu metod diğer altclası tarafından tamamen silinecektir.
            {
                Console.WriteLine("TextBox.Undo");
            }
        }
        public class RichTextBox :TextBox,IUndoable//IUndoable tekrar belirttik çünkü Undo metodumuz virtual olarak tanımlanmadı. Burada IUndoable artık TextBoxtan bağımsızdır.
        {
            public void Undo()
            {
                Console.WriteLine("RichTextBox.Undo");
            }
        }
        static void Main(string[] args)
        {
            RichTextBox r = new RichTextBox();
            r.Undo();// RichTextBox.Undo
            ((IUndoable)r).Undo();// RichTextBox.Undo
            //((TextBox)r).Undo();//  Hata ! Dikkat ederseniz burada ((TextBox)r).Undo() metodu tanımsızdır hatası verecektir.

            Console.ReadKey();
        }
    }
}



Bu durumda ne yapmalıyız. TextBox içerisindeki Undo() metodumuzu public void olarak tanımlamamız yeterlidir.

using System;

namespace Interface3
{
    class Program
    {

        public interface IUndoable { void Undo();}
        public class TextBox : IUndoable
        {
            public void Undo()
            {
                Console.WriteLine("TextBox.Undo");
            }
        }
        public class RichTextBox :TextBox,IUndoable
        {
            public void Undo()
            {
                Console.WriteLine("RichTextBox.Undo");
            }
        }
        static void Main(string[] args)
        {
            RichTextBox r = new RichTextBox();
            r.Undo();// RichTextBox.Undo
            ((IUndoable)r).Undo();// RichTextBox.Undo
            ((TextBox)r).Undo();//TextBox.Undo

            Console.ReadKey();
        }
    }
}

Bu şekilde dikkat ederseniz TextBox.Undo metodumuzun özelliklerini korumuş olduk.
Virtual override yazdığımızda tüm özelliklerini RichTextBox a dönüştürmüştü.