Есть несколько разных подходов.
One. Полностью пропустите интерфейс и сделайте его абстрактным классом. Это проще, когда работает, но тот факт, что у вас может быть только один базовый класс, ограничивает использование в C #
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
}
}
Вы можете иметь один класс, реализующий интерфейс, а другой наследовать от него:
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;
}
}
Они могут также использовать статический вспомогательный класс, который не имеет ничего общего с иерархией, но который предоставляет методы, полезные для реализации функциональности.
Будьте осторожны с этим паттерном:
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
Даже если IEventRepository.Method1
определено более разумно, вышеприведенное может привести к путанице.