有几种不同的方法。
一。完全跳过接口,将其变为抽象类。当它起作用时,这更简单,但只能拥有一个基类的事实限制了 C# 中的使用。
public abstract class EventRepository
{
public abstract int MustBeOverridden(string str);
public virtual int CanBeOverridden(int i)
{
return 4;
}
public int CannotOverride(string str)
{
return MustBeOverridden(str) + 3;
}
}
你可以让一个类实现接口,另一个类从它派生:
public interface IEventRepository
{
int Method1(string str);
int Method2(string str);
}
public class EventClass1 : IEventRepository
{
public int Method1(string str)
{
return 1;
}
public virtual int Method2(string str)
{
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;
}
}
他们可能还会使用一个静态的帮助类,与层次结构无关,但提供的方法有助于实现功能。
但要小心这种模式:
public class EventClass1 : IEventRepository
{
public int Method1(string str)
{
return 1;
}
public int Method2(string str)
{
return 2;
}
}
public class EventClass2 : EventClass1, IEventRepository
{
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));
Console.WriteLine(e1.Method1(null));
Console.WriteLine(ie.Method1(null));
即使IEventRepository.Method1
被更明智地定义,上述情况仍可能导致混淆。