Наследование интерфейсов Интерфейсные свойства


dArray[0] = new DiagramObject(); dArray[1] = new TextObject("Text Dude"); dArray[2] = new TextObject("Text Backup")


Download 0.67 Mb.
bet4/8
Sana18.06.2023
Hajmi0.67 Mb.
#1571717
1   2   3   4   5   6   7   8
Bog'liq
Абстракатные классы

dArray[0] = new DiagramObject(); dArray[1] = new TextObject("Text Dude"); dArray[2] = new TextObject("Text Backup");
foreach (DiagramObject d in dArray) { if (d is IScalable) { IScalable scalable = (IScalable) d; scalable.ScaleX(0.1F); scalable.ScaleY(10.0F); } } } }
Прежде чем выполнить приведение типа, мы проверяем, поддерживается ли этим типом данный интерфейс, чтобы удостовериться, что приведение будет проведено успешно. Если тип поддерживает данный интерфейс, объект приводится к типу интерфейса, и вызываются функции масштабирования.
К сожалению, этот код проверяет тип объекта на совместимость с типом интерфейса дважды: в первый раз - при вызове оператора isи второй раз - непосредственно перед приведением (эта проверка является частью процесса приведения). Это расточительно, так как в данном случае приведение в любом случае всегда будет успешным.
Один из способов решения этой проблемы мог бы состоять в том, чтобы добавить в код обработку исключений. Но это не самая лучшая идея, потому что это сделало бы код более сложным. Обработку исключений вообще нужно использовать только в крайних случаях. Кроме того, вряд ли такой код работал бы быстрее, так как использование исключений само по себе несколько накладно.

Наследование интерфейсов


Один интерфейс может наследовать другой. Синтаксис наследования интерфейсов такой же, как и у классов. Когда в классе реализуется один интерфейс, наследующий другой, в нем должны быть реализованы все члены, определенные в цепочке наследования интерфейсов.
Таким образом, интерфейсы могут быть организованы в иерархии. Как и в иерархии классов, в иерархии интерфейсов, когда какой-то интерфейс расширяет существующий, он наследует все абстрактные члены своего родителя (или родителей). Конечно, в отличие от классов, производные интерфейсы никогда не наследуют саму реализацию. Вместо этого они просто расширяют собственное определение за счет добавления дополнительных абстрактных членов.
Использовать иерархию интерфейсов может быть удобно, когда нужно расширить функциональность определенного интерфейса без нарушения уже существующих кодовых баз.
using System;
namespace ConsoleApplication1
{
public interface A
{
int Sum();
}
// Унаследованный интерфейс
public interface B : A
{
int Del();
}
class MyOperation : B
{
int x = 10, y = 5;
public int Sum()
{
return x + y;
}
public int Del()
{
return x / y;
}
}
class Program
{
static void Main()
{
}
}
}
Обратите внимание, что класс MyOperation реализует методы обоих интерфейсов, иначе возникла бы ошибка при компиляции:

В отличие от классов, один интерфейс может расширять сразу несколько базовых интерфейсов, что позволяет проектировать очень мощные и гибкие абстракции.

Download 0.67 Mb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling