Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Троелсен Э. -> "С# и платформа .NET. Библиотека программиста" -> 87

С# и платформа .NET. Библиотека программиста - Троелсен Э.

Троелсен Э. С# и платформа .NET. Библиотека программиста — СПб.: Питер, 2004. — 796 c.
ISBN 5-318-00750-3
Скачать (прямая ссылка): cplatforma2004.pdf
Предыдущая << 1 .. 81 82 83 84 85 86 < 87 > 88 89 90 91 92 93 .. 320 >> Следующая

Второй способ получить ссылку на интерфейс — использовать ключевое слово as:
// Еще один способ получить ссылку на интерфейс
Hexagon hex2 = new HexagonC"Peter");
!Pointy itfPt2:
itfPt2 - hex2 as IPointy;
if(itfPt2 != null)
Console.Wri teL і ne(і tfPt2. Get NumberOfPo і nts O);
else
Console.WriteLlnet"OOPS! Not pointy..."):
Если при использовании ключевого слова as мы попробуем создать ссылку на интерфейс через объект, который этот интерфейс не поддерживает, ссылка будет просто установлена в null, и при этом никаких исключений генерироваться не
будет.
Третий способ получения ссылки на интерфейс — воспользоваться оператором і s. Если объект не поддерживает интерфейс, условие станет равно те", se:
// Есть ли у тебя углы? Triangle t = new TriangleC); if(t is IPointy)
Console.W ri teL і ne(t. GetNumberOfPo і nt s());
else
Console.WrtteLinet"OOPS! Not pointy..."):
Если у нас имеется массив разных объектов и нам необходимо будет
в процессе выполнения, какие именно объекты из этого массива поддерживают определенный интерфейс, это можно сделать любым из приведенных выше способов. Например, так:
// Давайте выясним (во время выполнения), у каки;: .геометрических фигур есть углы Shape[] s = {new Hexagonu. newCircleO. new TriangleCJoe"). new CircleCJoJD"}}
202 Глава 4 • Интерфейсы и коллекции
I ' D:\CSharpBook\Labs\Chapter 4\5Ьдре.„ -N*|
Dраї ing NnNrtFie the Hexagon Points: 6 Орлі ing HnNane the Circle MoNc ne'5 not pointy! Di-лі ing Joe the Tririni/lR Points: 3 Drrtuing .loJo the Circle JoJo'a not pointy? Press any bey to continue 3 —і
21
Рис. 4.З. Во время выполнения программы определяем, как себя будет вести объект
Интерфейсы как параметры
Интерфейсы можно рассматривать как сугубо специальные переменные. Это сходство подтверждается тем, что С# позволяет использовать интерфейсы как параметры, принимаемые и возвращаемые методами. Для наглядности представим, что мы определили еще один интерфейс с именем IDraw3D:
// Интерфейс для отображения фигур в трех измерениях:
public interface IDraw30
{
void DrawSDO;
}
Предположим, что этот интерфейс реализован только в двух из трех наших классов для геометрических фигур — в классах Ci rcl е и Hexagon:
// Circle поддерживает интерфейс IDraw3D public class Circle : Shape, IDraw3D {
public void Draw3D() [
Console. Wri teLir.e("Drawing Circle in
//Если наши тгаш поддерживают несколько интерфейсов. нукно просто перечислить
// эти интерфейсы через запятую, как обычно: public Class Hexagon : Shape. IPointy, IDrawSD
for(int i < s "ета^: i++)
:{
// Вспомини, что базовый класс ShapeO определяет абстрактный метод DrawO s[i].DrawO:
// У каких геометрических фигур в массиве есть угли? if(s[1] is IPointy)
Consolе.WrіteLine("Points: {O)". ((IPointy)s[i]).GetNumberQfPoints()):
else
Console.WriteLineCs[і].PetName + "\'s not pointy!");
}
Результат выполнения этой программы представлен на рис. 4.3.
Программирование с использованием интерфейсов 203
{
public void OrewSDU {
Console.WriteLinet "Drawing Hexagon in 3D!");
)
)
Если определить какой-нибудь метод, принимающий интерфейс ШгакЗО в честве параметра, можно будет просто передавать этому методу любой объект, под держивающий IDraw3D, например:
// Созлаеи несколько геометрических фигур. Если они поддерживает отображение
//а трех измерениях, делаем это!
public class ShapesApp {
Il Будут нарисованы все объекты, поддерживающие интерфейс IDraw3D public static void DrawTh1sShapeIn3D(IDraw3D itf3d)
{
itf3d.Draw3DO:
}
public static int Mt.:- - ч , ; args)
{
Shape[] s = (new HexagonO. newCircleO,
newTriangleO. newC1rcle("JoJo")}:
fc-rt-^t i=0; Ks. Length: W) {
Il Могу ли я нарисовать этот объект в трех измерениях? lf(s[i] is IDraw30)
DrawThisShapeIn3D((IDraw3D)s[i]):
1
return 0;
Результат работы этой программы представлен на рис. 4.4. Поскольку Tri angl в (треугольник) у нас не поддерживает интерфейс I Draw3D, то он и не будет нарисоваї і.
D:\LSharpnuDkUabs\Chapter-4\Shap... ННІЗ
Drawing Hexagon in 3DT Drawing Circle in 3D* Drawing Circle in 3DT Press any J-.t-7 to continue
LX
Рис. 4.4. Выясняем, какие типы поддерживают интерфейс IDraw3D
Явная реализация интерфейса
В нашем предьщущем примере мы назвали единственный метод интерфейса I Draw;; D именем Draw3DU - главным образом, чтобы избежать конфликта имен с методом Drav.'i.), определенным в базовом классе Shape:
204 Глава 4 • Интерфейсы и коллекции
// Интерфейс для отображения геометрических фигур в трех измерениях public interface IDraw3D
{
void Draw3D();
J
В принципе, такое определение интерфейса и метода вполне нас может устроить. Однако более удобным именем метода, пожалуй., все-таки было имя Draw();
// Интерфейс для отображения геометрических фигур в трех измерениях
public interface IDrawSD
І
void DrawO:
}
Однако не возникнет ли у нас проблем, если мы попытаемся создать класс, одновременно производный от класса Shape() и реализующий интерфейс IDraw3D? Ведь теперь метод с именем Drawf} и унаследован от базового класса, и получен от интерфейса IDraw3D.
Предыдущая << 1 .. 81 82 83 84 85 86 < 87 > 88 89 90 91 92 93 .. 320 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100