Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Пример опредиления интерфейса и работы с ним






Рассмотрим интерфейс 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# могут быть членами интерфейсов?






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.