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ü.