AllenG получил мой плюс один, но так как я уже напечатал это, вот более длинная и более явная демонстрация концепции ...
Определите ваш интерфейс ...
public interface IFoo
{
void DoIt();
void DoItWithoutDefaultBehavior();
}
Определите базовый класс, который реализует интерфейс с некоторыми поведениями по умолчанию, или, возможно, некоторые методы не имеют поведения по умолчанию ...
public abstract class BaseFoo : IFoo
{
public virtual void DoIt()
{
// Base behavior
Console.WriteLine("base");
}
// This one has no base behavior
public abstract void DoItWithoutDefaultBehavior();
}
Некоторые из ваших подклассов могут использовать эти поведения по умолчанию ...
public class DerivedFoo1 : BaseFoo, IFoo
{
// Doesn't override DoIt, takes BaseFoo
public override void DoItWithoutDefaultBehavior()
{
Console.WriteLine("foo1");
}
}
Другие могут добавить к ним ...
public class DerivedFoo2 : BaseFoo, IFoo
{
public override void DoIt()
{
base.DoIt();
// Additional stuff
Console.WriteLine("derived");
}
public override void DoItWithoutDefaultBehavior()
{
Console.WriteLine("foo2");
}
}
Вы можете вызывать методы через класс или интерфейс.
void Main()
{
var foo1 = new DerivedFoo1();
foo1.DoIt();
var foo2 = new DerivedFoo2();
foo2.DoIt();
IFoo foo1AsFoo = new DerivedFoo1();
foo1AsFoo.DoIt();
IFoo foo2AsFoo = new DerivedFoo2();
foo2AsFoo.DoIt();
}
См. Также: Пост Эрика Липперта , в котором обсуждается, должны ли DerivedFoo1
и DerivedFoo2
подтвердить, что они реализуют IFoo
, когда BaseFoo
уже говорит об этом. Они делают в моем примере ради явного.
EDIT
Определенно можно добавлять события в интерфейс. Я внес следующие изменения в свой пример. Вы можете внести аналогичные изменения:
- К
interface IFoo
, добавьте event EventHandler TheEvent;
- К
BaseFoo
, добавьте public event EventHandler TheEvent;
- К
BaseFoo.DoIt
, добавьте if (TheEvent != null)
{
var args = new EventArgs();
TheEvent(this, args);
}
- Добавить
public void TheHandler(object sender, EventArgs e)
{
Console.WriteLine("Fired.");
}
- К
Main
, добавьте foo1.TheEvent += TheHandler;
Вывод теперь становится
base
Fired.
base
derived
base
base
derived