Интерфейсы предоставляют средство обобщения классов, от которых требуются реакция на определенные вызовы.
Список вызовов, на которые должен реагировать класс (эти вызовы могут быть представлены в форме
вызовов методов, изменении значений свойств и индексаторов, генерации событий) собираются
в интерфейсе. Если класс реализует интерфейс, мы смело можем делать с ним то, что описано в этом
интерфейсе.
interface IEnumGenerator
{
string GenerateEnumeration( ArrayList objects );
}
class ColonEnumGenerator : IEnumGenerator
{
public string GenerateEnumeration( ArrayList objects )
{
string result = "";
foreach (object obj in objects)
result += (result == "" ? "" : ", ") + obj.ToString();
return result;
}
}
class CREnumGenerator : IEnumGenerator
{
public string GenerateEnumeration( ArrayList objects )
{
string result = "";
for (int i = objects.Count - 1; i >= 0; i--)
result += (result == "" ? "" : "\n") + objects[i].ToString();
return result;
}
}
class Class1
{
[STAThread]
static void Main(string[] args)
{
ArrayList list = new ArrayList();
list.Add("Matt");
list.Add("Julia");
list.Add("Robert");
IEnumGenerator cgen = new ColonEnumGenerator();
Console.WriteLine(cgen.GenerateEnumeration(list));
cgen = new CREnumGenerator();
Console.WriteLine(cgen.GenerateEnumeration(list));
}
}
|
Важно отметить, что интерфейсы могут наследоваться от других интерфейсов.
interface A
{
void MethodA();
}
interface B : A
{
void MethodB();
}
class C : A, B
{
public void MethodA()
{
}
public void MethodB()
{
}
}
|
Также в ряде случаев (например, при реализации двух интерфейсов с одинаковыми членами) полезно
использовать явную реализацию. Если член интерфейса реализован явно, доступ к нему может быть
получен только через значение типа интерфейса:
interface IGameObject
{
string GetName();
}
interface IPlayer
{
string GetName();
}
class Smith : IGameObject, IPlayer
{
public IGameObject.GetName()
{
return "Player";
}
public IPlayer.GetName()
{
return "Smith";
}
}
class Application
{
public static void Main()
{
Smith smith = new Smith();
// Ошибка
// smith.GetName();
IGameObject gosmith = (IGameObject)smith;
IPlayer psmith = (IPlayer)smith;
// Player
Console.WriteLine(gosmith.GetName());
// Smith
Console.WriteLine(psmith.GetName());
}
}
|