Top.Mail.Ru

Язык С#. Интерфейсы

Интерфейс представляет собой полностью абстрактный класс без полей, все методы которого описаны, но не реализованы. Таким образом, интерфейс описывает набор методов, которые должен реализовать любой класс, исполняющий этот интерфейс. Класс, исполняющий интерфейс, называется интерфейсным классом. Интерфейсный класс может содержать не только реализацию методов интерфейса, но и свои методы, поля, свойства. Однако, он обязательно должен содержать реализацию всех интерфейсных методов.  Для описания интерфейса используется зарезервированное слово interface. В интерфейсе нельзя указывать модификаторы доступа, которые следует указывать в интерфейсном классе.

Важное отличие интерфейсного класса от обычного заключается в том, что он может иметь несколько родительских интерфейсов. Таким образом, в C# разрешено множественное наследование, но только в интерфейсных классах. Интерфейсный класс может наследовать не только от интерфейсов, но и от одного (и только одного!!!) обычного класса, по отношению к которому он ведет себя как обычный наследник, то есть может переопределять его методы, добавлять поля.

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Interface

{

    interface IDemo     // интерфейс - полностью абстрактный класс

    {

        // методы без реализации!!!!

        void Show();    // метод вывода

        double Len();   // метод вычисления

        int px { get; set; }   //свойство для поля х

        int py { get; set; }   // свойство для поля y

    }

    public class Point : IDemo  // интерфейсный класс Point

    {

        protected int x;   // защищенное поле х

        protected int y;   // защищенное поле y

 

        public Point(int X,int Y){x=X;y=Y;}    // конструктор для интерфейсного класса Point

        public void Show() {Console.WriteLine("x={0} y={1}",x,y);}  // метод вывода для интерфейсного класса

        public double Len() {double l=Math.Sqrt((x*x)+(y*y)); return l;}  // метод вычисления для интефейсного класса

        public int px { set { x = value; } get { return x; } }   //свойство для поля х интерфейсного класса

        public int py { set { y = value; } get { return y; } }    // свойство для поля y интерфейсного класса

    }

    public class ZPoint:Point,IDemo  // класс ZPoint, наследный интерфейсный класс

    {

            protected int z;       // защищенное поле z                      

            public ZPoint(int X, int Y, int Z) : base(X, Y) { z = Z; }  // конструктор класса интерфейсного наследника

            public void Show() { Console.WriteLine("x={0} y={1} z={2}", x, y, z); } // метод вывода для интерфейсного наследника

            public double Len() { double l = Math.Sqrt((x * x) + (y * y) + (z * z)); return l; }   // метод вычисления для интефейсного наследника

        }

     class Program

    {

        static void Main(string[] args)

        {

            IDemo[] m = new IDemo[5];    // массив ссылок типа интефейс

            

            m[0] = new Point(1, 1);  // 0 элемент - объект класса Point

            m[0].Show();

            Console.WriteLine("LEN = " + m[0].Len());

 

            m[1] = new ZPoint(1, 1, 1);  // 1 элемент - объект класса Point

            m[1].Show();

            Console.WriteLine("LEN = " + m[1].Len());

 

            m[2] = new Point(3, 4);  // 2 элемент - объект класса Point

            m[2].Show();

            Console.WriteLine("LEN = " + m[2].Len());

 

            m[3] = new ZPoint(5, 4, 3);  // 3 элемент - объект класса ZPoint

            m[3].Show();

            Console.WriteLine("LEN = " + m[3].Len());

 

            m[4] = new ZPoint(10, 6, 8);  //4 элемент - объект класса ZPoint

            m[4].Show();

            Console.WriteLine("LEN = " + m[4].Len());

 

            m[2].px = 10;    // изменение свойства х для элемента 2

            m[2].Show();

            Console.WriteLine("LEN = " + m[2].Len());

             Console.ReadLine();

               }

    }

}