Учебник Visual Basic .NET Выражения, операторы Классы и объекты Наследование и интерфейсы Обработка событий и делегаты Обработка ошибок Формы Windows Ввод-вывод Многопоточные приложения Поддержка баз данных Обзор ASP .NET

Имена функций вводят нас в заблуждение, так как на самом деле эти функции ничего не задают и не определяют. Работая в паре, они дают способ задания двух вещественных коэффициентов растяжения (сжатия) путем задания четырех целых чисел. Параметры функций должны быть целыми или объектами класса csize, которые тоже создаются из двух целых. Значительно проще было бы задать два вещественных числа и использовать их в качестве коэффициентов. Объяснение наблюдаемой реальности, видимо, кроется в истории разработки функций API (сложности с floating point-арифметикой).

Механика реализации интерфейса

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

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

Public Function Rate(ByVal aPerson As Employee) As String _

Implements ILead.Rate End Function

Конечно, имена членов интерфейса обычно совпадают с именами методов, их реализующих, но это не обязательно. Например, следующий фрагмент вполне допустим.

Public Property OurMoraleFund() As Decimal Implements

Head.MoraleFund Get

Return m_Moral e Fund

End Get

Set(ByVal Value As Decimal)

m_MoraleFund =Value

End Set

End Property

Главное, чтобы типы параметров и возвращаемого значения соответствовали сигнатуре данного члена интерфейса. При объявлении метода могут использоваться любые допустимые модификаторы, не мешающие выполнению контракта, — Overloads, Overrides, Overridable, Public, Private, Protected, Friend, Protected Friend, MustOverride, Default и Static. Запрещается только использовать атрибут Shared, поскольку члены интерфейса должны принадлежать конкретному экземпляру, а не классу в целом.

Если в реализации интерфейса используется член класса с модификатором Pri vate, обращения к этому члену возможны только через переменную, объявленную с типом данного интерфейса. В отличие от предыдущих версий VB в остальных случаях к членам интерфейса всегда можно обращаться через объекты класса. Теперь вам не придется присваивать их промежуточным интерфейсным переменным. Пример:

Dim tom As New LeadProgrammer("Tom",65000) tom.SpendMoraleFund(500)

Однако в обратных преобразованиях приходится использовать функцию СТуре:

Dim tom As New LeadProgrammer("Tom". 65000)

Dim aLead As ILead.aName As String

aLead = tom

aName = Ctype(aLead. Programmer).TheName 'OK

Следующая строка недопустима:

aName =tom.TheName ' ЗАПРЕЩЕНО!

Ниже перечислены общие правила преобразования между типом объекта и интерфейсом, им реализуемым.

Чтобы определить, реализует ли объект некоторый интерфейс, воспользуйтесь ключевым словом TypeOf в сочетании с Is. Пример:

Dim torn As New LeadProgrammer("tom". 50000)

Console.WriteLine((TypeOf (tom) Is Head))

Вторая строка выводит значение True.

Один метод может реализовывать несколько функций, определенных в одном интерфейсе:

Public Sub itsOK Implements

Interface1.Ml.Interfacel.M2,Interfacel.M3

Ниже приведена полная версия класса LeadProgrammer. Конечно, реализация методов интерфейса выглядит несколько условно, однако опадает представление о том, что можно сделать при реализации интерфейса:

Public Class LeadProgrammer

Inherits Programmer Implements Head

Private m_MoraleFund As Decimal

Private m_MyTeam As Employee()

Public Function Rate(ByVal aPerson As Employee) As String _

Implements Head.Rate

Return aPerson.TheName & "rating to be done"

End Function

Public Property MyTeam() As Employee()

Implements ILead.MyTeam

Get

Return m_MyTeam

End Get

SeUByVal Value As Employee()) X.

m_MyTeam = Value

End Set End Property

Public Sub SpendMoraleFund(ByVal

amount As Decimal)_

Implements ILead.SpendMocaleFund

' Израсходовать средства из фонда мат. поощрения

Console.WriteLine("Spent " & amount.ToString())

End Sub

Public Property OurMoraleFund()As Decimal

Implements ILead.MoraleFund

Get

Return m_MoraleFund

End Get

SettByVal Value As Decimal)

m_MoraleFund = Value

End Set End Property

Public Sub New(ByVal theName As String. ByVal curSalary As Decimal)

MyBase.New(theName. curSalary)

End Sub

End Class

Если мы зададимся целью масштабировать изображение, то есть дать пилы-юним-;-лю возможность изменять его размеры, то нам следует научиться управлять режимами и параметрами отображения логической системы координат в физическую. Вы уже знаете, что Win32 API использует четыре координатных пространства (spaces): World space, Page space, Device space, и Physical Device space. Однако большая часть документации и книг но MFC оперируют только двумя терминами: логическая и физическая системы координат. Мы будем использовать термин, логическая система координат, имея в виду Page space.