Механика реализации интерфейса. Нетривиальное применение интерфейсов.
Ниже приведена полная версия класса 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
Нетривиальное применение интерфейсов
Интерфейсы также могут объявляться производными от других интерфейсов. В этом случае интерфейс просто дополняется новыми членами. Предположим, в нашей системе учета кадров ведущим программистам предоставлено право разрешать модернизацию компьютеров своих подчиненных. В программе это моделируется методом UpGradeHardware:
Public Interface ILeadProgrammer Inherits Head Public Function UpGradeHardware(aPerson As Programmer) End Interface
В этом случае реализация ILeadProgrammer требует дополнительного выполнения контракта интерфейса Head.
В отличие от классов, которые могут наследовать лишь от одного базового класса, интерфейс может быть объявлен производным от нескольких интерфейсов:
Public Interface ILeadProgrammer Inherits Head.Inherits ICodeGuru Public Function UpGradeHardware(aPerson As Programmer) End Interface
Поскольку интерфейс может наследовать от нескольких интерфейсов, реальна ситуация, при которой в нем потребуется определить два одноименных метода, принадлежащих к разным интерфейсам, – например, если интерфейсы Head и ICodeGuru содержат методы с именем SpendMoraleFund. В этом случае вы не сможете обратиться к одному из этих методов через переменную типа, реализующего такой интерфейс:
Dim tom As New LeadProgrammer("Tom", 65000) tom.SpendMoraleFund(500)
Интерфейс должен указываться явно, как в следующем фрагменте:
Dim tom As New LeadProgrammer("Tom", 65000) Dim aCodeGuru As ICodeGuru aCodeGuru = tom aCodeGuru.SpendMoraleFund(500)