dotSITE
Вопросы/Ответы Учебник по ASP.NET Форумы
новости материалы решения форумы группы настройки/о проекте

Интерфейсы

Интерфейсы предоставляют средство обобщения классов, от которых требуются реакция на определенные вызовы. Список вызовов, на которые должен реагировать класс (эти вызовы могут быть представлены в форме вызовов методов, изменении значений свойств и индексаторов, генерации событий) собираются в интерфейсе. Если класс реализует интерфейс, мы смело можем делать с ним то, что описано в этом интерфейсе.

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());
    }
}

<< Предыдущая Следующая >>

Контакт Реклама на сайте Спонсорам Веб мастерам

Лицензионное соглашение - © 2000-2012 dotSITE
Хостинг .NET предоставлен PARKING.RU
Поддержку сайта осуществляет Murano Software Inc., Offshore software development