![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Пример опредиления интерфейса и работы с ним
Рассмотрим интерфейс IDemo и его реализацию для классов DemoPoint и DemoLine //определение интерфейса
interface IDemo { void Show(); //объявление метода double Dlina(); //объявление метода int X {get; } //объявление свойства, доступного только для чтения int this [int i]{get; set; } //объявление индексатора, доступного для чтения-записи } //класс DemoPoint наследует интерфейс IDemo class DemoPoint: IDemo { protected int x; protected int y; public DemoPoint (int x, int y) { this.x=x; this.y=y; } public void Show() //реализация метода, объявленного в интерфейсе { Console.WriteLine(" точка на плоскости: ({0}, {1})", x, y); } public double Dlina() //реализация метода, объявленного в интерфейсе { return Math.Sqrt(x*x+y*y); } public int X //реализация свойства, объявленного в интерфейсе { get { return x; } } public int this [int i] //реализация индексатора, объявленного в интерфейсе { get { if (i==0) return x; else if (i==1) return y; else throw new Exception(" недопустимое значение индекса"); } set { if (i==0) x=value; else if (i==1) y=value; else throw new Exception (" недопустимое значение индекса"); } } } //класс DemoShape наследует класс DemoPoint и интерфейс IDemo class DemoShape: DemoPoint, IDemo { protected int z; public DemoShape(int x, int y, int z): base(x, y) { this.z=z; } // реализация метода, объявленного в интерфейсе, с сокрытием одноименного метода из базового класса public new void Show() { Console.WriteLine(" точка в пространстве: ({0}, {1}, {2})", x, y, z); } // реализация метода, объявленного в интерфейсе, с сокрытием одноименного метода из базового класса public new double Dlina() { return Math.Sqrt(x*x+y*y+z*z); } // реализация индексатора, объявленного в интерфейсе, с сокрытием одноименного индексатора из базового класса public new int this [int i] { get { if (i==0) return x; else if (i==1) return y; else if (i==2) return z; else throw new Exception (" недопустимое значение индекса"); } set { if (i==0) x=value; else if (i==1) y=value; else if (i==2) z=value; else throw new Exception (" недопустимое значение индекса"); } } } class Program { static void Main() { //создание массива интерфейсных ссылок IDemo []a =new IDemo[4];
//заполнение массива a[0]=new DemoPoint(0, 1); a[1]=new DemoPoint(-3, 0); a[2]=new DemoShape(3, 4, 0); a[3]= new DemoShape(0, 5, 6);
//просмотр массива foreach (IDemo x in a) { x.Show(); Console.WriteLine(" Dlina={0: f2}", x.Dlina()); Console.WriteLine(" x=" +x.X); x[1]+=x[0]; Console.Write(" новые координаты - "); x.Show(); Console.WriteLine(); } } } Обратите внимание, что в интерфейсе IDemo было объявлено свойство Х, доступное только для чтения. Наследуя интерфейс IDemo, класс DemoPoint определил реализацию данного свойства. Класс DemoShape, наследуя класс DemoPoint и IDemo, не предложил собственной реализации свойства Х, поэтому при обращении к объекту типа DemoShape вызывается реализация данного свойства, определенная в базовом классе. Контрольные вопросы: 1. Что понимается под термином «интерфейс»? 2. Чем отличается синтаксис интерфейса от синтаксиса абстрактного класса? 3. Какие объекты языка C# могут быть членами интерфейсов?
|