bazı farklı yaklaşımlar var.
One. Arayüzü tamamen atla ve soyut bir sınıf yap. çalıştığını, ancak yalnızca bir temel sınıfa sahip olabileceği gerçeği
public abstract class EventRepository
{
public abstract int MustBeOverridden(string str);//classes have to override this
public virtual int CanBeOverridden(int i)//classes can override but may choose not to.
{
return 4;
}
public int CannotOverride(string str)//this is always the same
{
return MustBeOverridden(str) + 3;//can make use of this
}
}
tek bir sınıf arabirimini uygulamak olabilir C# kullanımını kısıtlar, bu basittir ve başka ondan türetmek:
public interface IEventRepository
{
int Method1(string str);
int Method2(string str);
}
public class EventClass1 : IEventRepository
{
public int Method1(string str)//can't be overridden as not marked virtual
{
return 1;
}
public virtual int Method2(string str)//can be overridden
{
return 2;
}
}
public class EventClass2 : EventClass1
{
public override int Method2(string str)
{
return -2;
}
}
public abstract class EventClass : IEventRepository
{
public abstract int Method1(string str);
public int Method2(string str)
{
return 2;
}
}
public class EventClass1 : EventClass
{
public override int Method1(string str)
{
return 1;
}
}
public class EventClass2 : EventClass
{
public override int Method1(string str)
{
return -1;
}
}
Ayrıca, hiyerarşi ile ilgisi yoktur statik yardımcı sınıf kullanabilir fakat:
ikisini bazı ortak davranışlar veren soyut bir sınıf geçersiz kılmak mı işlevselliği uygulamada yararlı olan yöntemleri sağlar.
olsa bu desen karşı dikkatli olun:
IEventRepository.Method1
daha makul tanımlandığında
public class EventClass1 : IEventRepository
{
public int Method1(string str)//not override-able
{
return 1;
}
public int Method2(string str)//not override-able
{
return 2;
}
}
public class EventClass2 : EventClass1, IEventRepository
{
//We really want our own Method1!
public new int Method1(string str)
{
return 3;
}
int IEventRepository.Method1(string str)
{
return -1;
}
}
EventClass2 e2 = new EventClass2();
EventClass1 e1 = e2;
IEventRepository ie = e2;
Console.WriteLine(e2.Method1(null));//3
Console.WriteLine(e1.Method1(null));//1
Console.WriteLine(ie.Method1(null));//-1
bile, yukarıda karışıklığa yol açması muhtemeldir.
Tam olarak neden bir arabirim kullanıyorsunuz? –